此章節提供您將 Gradle 6.x 建置移轉到 Gradle 7.0 所需的資訊。若要從 Gradle 5.x 或更早版本移轉,請先完成較舊的移轉指南

我們建議所有使用者執行下列步驟

  1. 嘗試執行 gradle help --scan 並檢視產生的建置掃描的不建議使用檢視

    Deprecations View of a Gradle Build Scan

    這樣您就可以看到套用於您的建置的任何不建議使用警告。

    或者,您可以執行 gradle help --warning-mode=all 以在主控台中查看不建議使用的部分,儘管它可能不會報告太多詳細資訊。

  2. 更新您的外掛。

    某些外掛會因這個新版本的 Gradle 而中斷,例如因為它們使用已移除或變更的內部 API。上一步驟將透過在外掛嘗試使用已不建議使用的 API 部分時發出不建議使用警告,來協助您找出潛在問題。

  3. 執行 gradle wrapper --gradle-version 7.0 以將專案更新至 7.0。

  4. 嘗試執行專案並使用 疑難排解指南 除錯任何錯誤。

從 6.9 及更早版本升級

IDE 整合的變更

IDEA 模型的變更

getGeneratedSourceDirectories()getGeneratedTestDirectories() 方法已從 IdeaContentRoot 介面移除。客戶端應將這些呼叫替換為 getSourceDirectories()getTestDirectories(),並對傳回的執行個體使用 isGenerated() 方法。

相依性鎖定現在預設為每個專案一個檔案

相依性鎖定檔的格式已變更,因此每個專案只有一個檔案,而非每個專案的每個組態一個檔案。此變更僅影響鎖定檔的寫入。Gradle 仍有能力載入以舊格式儲存的鎖定狀態。

前往 文件 瞭解如何移轉至新格式。移轉可以針對每個組態執行,不一定要一次完成。Gradle 會在將它們移轉至新檔案格式時自動清除先前的鎖定檔。

Gradle 模組元資料現在預設可重製

buildId 欄位預設不會填入,以確保在沒有變更任何建置輸入時,產生的元資料檔保持不變。使用者仍可選擇將此唯一識別碼納入產生的元資料中,請參閱 文件

jcenter() 便利方法現在已棄用

JFrog 宣布 JCenter 儲存庫於 2021 年 2 月終止服務。許多 Gradle 建置 依賴 JCenter 的專案相依性。

沒有新的套件或版本發布到 JCenter,但 JFrog 表示他們會無限期地讓 JCenter 保持唯讀狀態。我們建議您考慮 使用 mavenCentral()google() 或私人的 maven 儲存庫。

jcenter() 作為儲存庫使用時,Gradle 會發出不建議使用的警告,而此方法預計在 Gradle 8.0 中移除。

潛在的重大變更

更新已綑綁的 Gradle 相依性

變更 Groovy 和 Groovy DSL

由於更新至 Groovy 的下一個主要版本,您在升級至 Gradle 7.0 時可能會遇到小問題。

新版本的 Groovy 具有更嚴格的剖析器,無法編譯在先前 Groovy 版本中可能被接受的程式碼。如果您遇到語法錯誤,請查看 Groovy 問題追蹤器Groovy 3 發行重點

一些非常具體的回歸 已在 Groovy 的下一個次要版本中修正。

Groovy 模組化

Gradle 不再內嵌將所有 Groovy 模組綑綁成單一 jar 檔的 groovy-all 副本—​只有最重要的模組會在 Gradle 發行版中發行。

localGroovy() 相依性將包含這些 Groovy 模組

  • groovy

  • groovy-ant

  • groovy-astbuilder

  • groovy-console

  • groovy-datetime

  • groovy-dateutil

  • groovy-groovydoc

  • groovy-json

  • groovy-nio

  • groovy-sql

  • groovy-templates

  • groovy-test

  • groovy-xml

但以下 Groovy 模組包含

  • groovy-cli-picocli

  • groovy-docgenerator

  • groovy-groovysh

  • groovy-jmx

  • groovy-jsr223

  • groovy-macro

  • groovy-servlet

  • groovy-swing

  • groovy-test-junit5

  • groovy-testng

您可以將這些相依性拉入您的建置,就像任何其他外部相依性一樣。

使用 Groovy 3 建置 Gradle 外掛程式

使用 gradleApi()localGroovy() 時,使用 Gradle 7.0 建置的外掛程式現在會在其 classpath 上擁有 Groovy 3。

如果您使用 Spock 來測試您的外掛程式,您將需要使用 Spock 2.x。Spock 1.x 和 Groovy 3 沒有相容版本。
dependencies {
    // Ensure you use the Groovy 3.x variant
    testImplementation('org.spockframework:spock-core:2.0-groovy-3.0') {
        exclude group: 'org.codehaus.groovy'
    }
}

// Spock 2 is based on JUnit Platform which needs to be enabled explicitly.
tasks.withType(Test).configureEach {
    useJUnitPlatform()
}
效能

根據子專案和 Groovy DSL 建置指令碼的數量,您可能會在首次編譯建置指令碼或變更建置指令碼的類別路徑時,注意到效能下降。這是因為 Groovy 3 解析器的效能較慢,但 Groovy 團隊已意識到此問題,並嘗試減輕效能下降。

一般來說,我們也在探討如何提升 Groovy DSL 和 Kotlin DSL 建置指令碼編譯的效能。

遇到「在 DefaultDependencyHandler 上找不到方法 X 的引數 Y」

雖然下列錯誤一開始看起來像是編譯錯誤,但實際上是因為已移除特定的 `Configuration`。請參閱 移除 `compile` 和 `runtime` 設定檔 以取得更多詳細資料。

Could not find method testCompile() for arguments [DefaultExternalModuleDependency{group='org.junit', name='junit-bom', version='5.7.0', configuration='default'}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

預設工具整合版本的更新

移除 `compile` 和 `runtime` 設定檔

自 Gradle 推出以來,便提供 `compile` 和 `runtime` 設定檔來宣告相依性。然而,這些設定檔不支援相依性的細緻範圍設定。因此,在 Gradle 3.4 中引入了更好的替代方案。

  • 應使用 `implementation` 設定檔來宣告相依性,這些相依性是函式庫的實作細節:在編譯期間不會對函式庫的使用者顯示。

  • 僅當您套用 `java-library` 外掛時才可用的 `api` 設定檔,應使用來宣告相依性,這些相依性是函式庫 API 的一部分,需要在編譯期間對使用者公開。

在 Gradle 7 中,已移除 `compile` 和 `runtime` 設定檔。因此,您必須移轉到上述的 `implementation` 和 `api` 設定檔。如果您仍對 Java 函式庫使用 `java` 外掛,您需要改為套用 `java-library` 外掛。

表格 1. 常見設定檔升級
已移除的設定檔 新的設定檔

compile

apiimplementation

runtime

runtimeOnly

testRuntime

testRuntimeOnly

testCompile

testImplementation

<sourceSet>Runtime

<sourceSet>RuntimeOnly

<sourceSet>Compile

<sourceSet>Implementation

你可以透過閱讀Java 函式庫外掛程式文件,找到有關新設定的優點,以及在何處使用 compileruntime 的更多詳細資訊。

在使用 Groovy DSL 時,處理移除的設定時,你需要注意特定的升級問題。

如果你建立的客製化設定會延伸其中一個已移除的設定,Gradle 可能會在沒有提示的情況下建立不存在的設定。

這看起來像

configurations {
  // This silently creates a configuration called "runtime"
  myConf extendsFrom runtime
}

客製化設定的相依性解析結果可能與 Gradle 6.x 或之前的版本不同。你可能會發現缺少相依性或成品。

ProjectBuilder 暫存專案檔案的位置

ProjectBuilder API 用於在單元測試中檢查 Gradle 建置。此 API 過去會在系統暫存目錄下建立暫存專案檔案,而系統暫存目錄是由 java.io.tmpdir 定義的。

此 API 現在會在 Test 工作的暫存目錄下建立暫存專案檔案。此路徑通常會在專案建置目錄下。當測試預期特定檔案路徑時,這可能會導致測試失敗。

如果測試使用 ProjectBuilder.withProjectDir(…​),則不受影響。

TestKit 測試的暫存檔案位置

使用TestKit API 的測試過去會在系統暫存目錄下建立暫存檔案,而系統暫存目錄是由 java.io.tmpdir 定義的。這些檔案用於儲存 Gradle 發行版的副本或另一個僅供測試的 Gradle 使用者主目錄。

TestKit 測試現在會在 Test 工作的暫存目錄下建立暫存檔案。此路徑通常會在專案建置目錄下。當測試預期特定檔案路徑時,這可能會導致測試失敗。

如果測試使用 GradleRunner.withTestKitDir(…​),則不受影響。

在 Windows 上使用 TestKit 進行檔案系統監控

Windows 上的檔案系統監控實作會在根目錄專案中新增鎖定,以監控變更。在使用 TestKit 執行建置後,當你嘗試刪除根目錄專案時,這可能會導致錯誤。例如,將 TestKit 與 JUnit 的 @TempDir 延伸模組或 TemporaryFolder 規則一起使用的測試可能會遇到這個問題。為了避免這些檔案鎖定的問題,TestKit 會停用透過 GradleRunner 在 Windows 上執行的建置的檔案系統監控。如果你想要覆寫預設行為,你可以透過將 --watch-fs 傳遞給 GradleRunner.withArguments() 來啟用檔案系統監控。

移除舊版 maven 外掛

maven 外掛已移除。您應該改用 maven-publish 外掛。

請參閱 Maven Publish 外掛文件 以取得更多詳細資訊。

移除 uploadArchives 任務

uploadArchives 任務與舊版 Ivy 或 Maven 發布機制搭配使用。已在 Gradle 7 中移除。您應該改為移轉到 maven-publishivy-publish 外掛。

請參閱 Maven Publish 外掛文件 以在 Maven 儲存庫上發布。請參閱 Ivy Publish 外掛文件 以在 Ivy 儲存庫上發布。

相依性版本排序變更

在相依性版本排序的脈絡中,-SNAPSHOT 版本現在被視為在最終版本之前,但任何 -RC 版本之後。也考慮了更多特殊版本字尾。這讓 Gradle 演算法更接近 Maven 演算法,以適用於眾所周知的版本字尾。

請查看 文件 以了解 Gradle 套用的所有規則。

移除 Play Framework 外掛

已移除已棄用的 Play 外掛。外掛入口網站提供外部替代方案,Play Framework 外掛

移除已棄用的 JVM 外掛

已移除這些未維護的替代 JVM 外掛:java-langscala-langjunit-test-suitejvm-componentjvm-resources

請改用穩定的 Java LibraryScala 外掛。

移除實驗性 JavaScript 外掛

已從發行版中移除以下用於實驗性 JavaScript 整合的外掛:coffeescript-baseenvjsjavascript-basejshintrhino

如果您使用這些外掛程式,儘管它們具有實驗性質,您可以在 外掛程式入口網站 中找到合適的替代品。

設定 Ivy 儲存庫的配置

採用設定區塊的 layout 方法已移除,並由 patternLayout 取代。

執行沒有設定檔的 Gradle 建置現在會產生錯誤

Gradle 建置是由其在目前或父目錄中找到的 settings.gradle(.kts) 檔所定義。沒有設定檔,Gradle 建置是未定義的,且 Gradle 會在嘗試執行任務時產生錯誤。

例外情況是使用 init 任務呼叫 Gradle,或使用診斷命令列旗標,例如 --version

在專案評估後呼叫 Project.afterEvaluate() 現在會產生錯誤

Gradle 6.x 會警告使用者錯誤的行為,並在這種情況下忽略目標動作。從 7.0 開始,相同的情況會產生錯誤。外掛程式和建置指令碼應調整為僅在設定時間呼叫 afterEvaluate。如果您有這種建置失敗,且相關的 afterEvaluate 陳述宣告在您的建置來源中,則您可以直接刪除它。如果 afterEvaluate 宣告在外掛程式中,則向外掛程式維護人員回報問題。

在值最後確定後修改檔案集合現在會產生錯誤

在計算儲存值後,對 ConfigurableFileCollection 呼叫任何變異器方法(例如 clear()add()remove() 等)會擲回例外。使用者和外掛作者應調整其程式碼,使 ConfigurableFileCollection 上的所有組態都在讀取值之前,於組態時間發生。

移除 ProjectLayout#configurableFiles

請改用 ObjectFactory#fileCollection()

移除 BasePluginConvention.libsDirBasePluginConvention.distsDir

請改用 libsDirectorydistsDirectory 屬性。

移除 UnableToDeleteFileException

現有用法應改用 RuntimeException

在 Checkstyle 和 PMD 外掛中移除的屬性

  • configDir getter 和 setter 已從 Checkstle 任務和擴充功能中移除。請改用 configDirectory 屬性。

  • rulePriority getter 和 setter 已從 Pmd 任務和擴充功能中移除。請改用 rulesMinimumPriority 屬性。

移除 distribution 外掛中的 baseName 屬性

getBaseName()setBaseName() 方法已從 Distribution 類別中移除。客戶端應將用法替換為 distributionBaseName 屬性。

使用 AbstractTask

在 Gradle 6.5 中已棄用使用 AbstractTask 類型或使用延伸 AbstractTask 的類型來註冊任務,且現在在 Gradle 7.0 中為錯誤。您可以改用 DefaultTask

移除 BuildListener.buildStarted(Gradle)

BuildListener.buildStarted(Gradle) 已在 Gradle 6.0 中棄用,且現在在 Gradle 7.0 中移除。請改用 BuildListener.beforeSettings(Settings)

移除未使用的 StartParameter API

自 Gradle 5.0 以後不再能透過命令列選項使用的下列 API 現已移除:StartParameter.useEmptySettings()StartParameter.isUseEmptySettings()StartParameter.setSearchUpwards(boolean)StartParameter.isSearchUpwards()

移除在「master」目錄中搜尋設定檔

Gradle 不再支援在同層目錄中名為 `master` 的目錄中尋找設定檔。如果您的組建仍使用這個已棄用的功能,請考慮將組建重構,讓根目錄與專案階層的實體根目錄相符。您可以在使用者手冊中找到更多關於 如何建構 Gradle 組建組建組合 的資訊。或者,您仍然可以透過僅使用 任務的完整限定路徑 從 `master` 目錄呼叫組建來執行此類組建中的任務。

modularity.inferModulePath 預設為「true」

編譯測試執行 現在會自動適用於任何透過包含 `module-info.java` 檔案來定義模組的來源組。通常,這是您需要的行為。如果這在您手動設定模組路徑或為其使用第三方外掛程式時造成問題,您仍然可以透過在 java 擴充功能或個別任務上將 `modularity.inferModulePath` 設定為 `false` 來選擇不使用這個功能。

移除 ValidateTaskProperties

ValidateTaskProperties 任務已移除,並由 ValidatePlugins 任務取代。

移除 ImmutableFileCollection

ImmutableFileCollection 類型已移除。請改用 工廠方法。可以透過 Project.layout 取得專案配置的控制項。

移除 ComponentSelectionReason.getDescription

ComponentSelectionReason.getDescription 方法已移除。它已由 ComponentSelectionReason.getDescriptions 取代,後者會傳回一個 ComponentSelectionDescriptor 清單,每個清單都有 getDescription

移除網域物件集合建構函式

已移除下列已棄用的建構函式

  • DefaultNamedDomainObjectList(Class, Instantiator, Namer)

  • DefaultNamedDomainObjectSet(Class, Instantiator)

  • DefaultPolymorphicDomainObjectContainer(Class, Instantiator)

  • FactoryNamedDomainObjectContainer(類別、實體化器、NamedDomainObjectFactory)

移除任意本機快取設定

現在必須透過 BuildCacheConfiguration.local() 執行本機建置快取設定。

移除 DefaultVersionSelectorScheme 建構函式

這個內部 API 已用於外掛程式,包括 Nebula 外掛程式,並已在 Gradle 5.x 時間表中標示為不建議使用,現在已移除。最新外掛程式版本不應再參照它。

checkstyle 外掛程式上設定 config_loc 設定屬性現在會產生錯誤

checkstyle 外掛程式現在會針對下列設定失敗

checkstyle {
    configProperties['config_loc'] = file("path/to/checkstyle-config-dir")
}

建置應使用 checkstyle 區塊宣告 checkstyle 設定

checkstyle {
    configDirectory = file("path/to/checkstyle-config-dir")
}

在產生器完成前查詢提供者的對應值現在會產生錯誤

Gradle 6.x 會針對錯誤行為發出警告,然後傳回可能不正確的提供者值。從 7.0 開始,相同情況會產生錯誤。外掛程式和建置指令碼應調整為在任務完成後查詢提供者的對應值,例如任務輸出屬性。

任務驗證問題現在會產生錯誤

Gradle 6.0 開始針對任務定義的問題(例如輸入或輸出定義不正確)發出警告。對於 Gradle 7.0,這些警告現在會產生錯誤,並導致建置失敗。

當與本機專案發生嚴格版本衝突時,行為會有所改變

先前 Gradle 版本在特定設定中,衝突解決行為不一致:- 專案宣告對已發布模組的嚴格依賴關係(例如,com.mycompany:some-module:1.2!!,其中 1.2!! 是對 1.2 的嚴格依賴關係簡寫)- 建置實際上以較高版本提供 com.mycompany:some-module

先前 Gradle 版本會成功,選擇專案依賴關係,即使有嚴格約束。從 Gradle 7 開始,這會觸發依賴關係解決失敗。

請參閱 此問題 以取得更多背景資訊。

廢棄

任務之間缺少依賴關係

如果任務在某個位置產生輸出,而另一個任務透過將該位置作為輸入來使用該輸出,但使用者任務未依賴於產生者任務,則此情況已被棄用。解決此問題的方法是 從使用者新增對產生者的依賴關係

重複策略

當複製作業(或任何使用 org.gradle.api.file.CopySpec 的作業)遇到重複項目,且未設定重複策略時,Gradle 7 現在會失敗。請參閱 CopySpec 文件 以取得詳細資料。

從 6.8 及更早版本升級

從 6.8 升級至 6.9 沒有升級注意事項,因為 6.9 僅包含錯誤修正。

從 6.7 及更早版本升級

潛在的重大變更

工具鏈 API 現在標記為 @NonNull

org.gradle.jvm.toolchain 中支援 Java 工具鏈功能的 API 現在標記為 @NonNull

這可能會影響 Kotlin 使用者,因為 API 的傳回類型不再為可為空。

更新預設工具整合版本

更新已套件化的 Gradle 依賴關係

  • Kotlin 已更新至 Kotlin 1.4.20。請注意,Gradle 腳本仍使用 Kotlin 1.3 語言。

  • Apache Ant 已更新至 1.10.9 以修正 CVE-2020-11979

匯入至 Eclipse 的專案現在包含自訂來源設定類別路徑

先前,Eclipse 導入的專案僅包含主要和測試來源組的相依性。自訂來源組的編譯和執行時期類別路徑會被忽略。

自 Gradle 6.8 起,導入 Eclipse 的專案包含建置定義的每個來源組的編譯和執行時期類別路徑。

SourceTask 不再對空目錄敏感

先前,在 SourceTask 中宣告的來源進行最新檢查和建置快取金鑰計算時,會考量空目錄。這表示包含空目錄的來源樹,和不包含空目錄的相同來源樹,會被視為不同的來源,即使任務會產生相同的輸出。在 Gradle 6.8 中,SourceTask 現在在進行最新檢查和建置快取金鑰計算時會忽略空目錄。在絕大多數情況下,這是預期的行為,但任務可能會延伸 SourceTask,但當來源中存在空目錄時也會產生不同的輸出。對於有此疑慮的任務,您可以公開一個沒有 @IgnoreEmptyDirectories 註解的獨立屬性,以擷取這些變更

@InputFiles
@SkipWhenEmpty
@PathSensitive(PathSensitivity.ABSOLUTE)
public FileTree getSourcesWithEmptyDirectories() {
    return super.getSource()
}

出版變更

發布具有強制平台相依性的元件現在會觸發驗證錯誤,防止意外發布不良的元資料:強制平台使用案例應限於應用程式,而不是可以從其他函式庫或應用程式使用的內容。

如果您基於某種原因仍想發布具有強制平台相依性的元件,您可以依照文件停用驗證。

在執行階段變更預設排除

Gradle 的檔案樹套用一些預設排除模式以提供便利,實際上與 Ant 的預設相同。請參閱使用者手冊以取得更多資訊。有時,Ant 的預設排除會造成問題,例如當您想在封存檔案中包含 .gitignore 時。

在執行階段變更 Gradle 的預設排除項可能會導致最新檢查的正確性問題。因此,您只能在設定指令碼中變更 Gradle 的預設排除項,請參閱使用者手冊中的範例。

不建議使用

參照包含組建中的工作

已不建議在 mustRunAftershouldRunAfterfinalizedBy 工作方法中直接參照包含組建中的工作。應使用 mustRunAftershouldRunAfter 指定的工作順序,以及 finalizedBy 指定的最後處理程序,以在組建中指定工作順序。如果您碰巧使用上述方法定義了跨組建的工作順序,請考慮重新調整此類組建的結構,並將它們彼此分離開來。

在「master」目錄中搜尋設定檔

如果您的組建依賴於在同層目錄中名為 master 的目錄中尋找設定檔,Gradle 會發出不建議使用的警告。

如果您的組建使用此功能,請考慮重構組建,使根目錄與專案層級結構的實際根目錄相符。

或者,您仍可透過僅使用工作完整限定路徑master 目錄呼叫組建來執行此類組建中的工作。

使用 NamedDomainObjectContainer<T>.invoke(kotlin.Function1) 方法

Gradle Kotlin DSL 擴充功能已變更,以優先使用 Gradle 的 Action<T> 類型而非 Kotlin 函式類型。

雖然此變更對 Kotlin 用戶端應該是透明的,但呼叫 Kotlin DSL 擴充功能的 Java 用戶端需要更新為使用 Action<T> API。

從 6.6 及更早版本升級

潛在的重大變更

buildSrc 現在可以看到根目錄中包含的組建

先前,buildSrc 的建置方式會忽略根目錄組建中包含的組建。

自 Gradle 6.7 起,buildSrc 可以看到根目錄組建中包含的任何組建。這可能會導致 buildSrc 中包含組建的相依性被替換。如果 buildSrc 需要包含的組建,這也可能會變更執行某些組建的順序。

預設工具整合版本的更新

不建議使用的項目

在執行階段變更預設排除項目

Gradle 的檔案樹套用一些預設排除模式以提供便利,實際上與 Ant 的預設相同。請參閱使用者手冊以取得更多資訊。有時,Ant 的預設排除會造成問題,例如當您想在封存檔案中包含 .gitignore 時。

在執行階段變更 Gradle 的預設排除項目可能會導致最新檢查的正確性問題,因此不建議使用。您只能在設定指令碼中變更 Gradle 的預設排除項目,請參閱 使用者手冊 以取得範例。

直接將組態當作相依性使用

Gradle 允許將 Configuration 的執行個體直接當作相依性使用

dependencies {
    implementation(configurations.myConfiguration)
}

此行為現已不建議使用,因為會造成混淆:人們可能會預期「相依性組態」會先解析,並將解析結果新增為相依性至包含的組態,但實際上並非如此。不建議使用的版本可以用實際行為取代,也就是組態繼承。

configurations.implementation.extendsFrom(configurations.myConfiguration)

從 6.5 及更早版本升級

潛在的重大變更

已套件化的 Gradle 相依性的更新

依存項替換和變異感知依存項解析

在依存項替換中新增表達 變異支援 的同時,一個錯誤修正引發了某些建置可能依賴的行為變更。先前,替換的依存項仍會使用原始選擇器的 屬性,而非替換選擇器的屬性。

有了這項變更,針對具有更豐富選擇器的依存項(例如平台依存項)的現有替換將不再像以前一樣運作。必須在目標選擇器中定義變異感知部分。

如果您有下列情況,可能會受到此變更影響

  • 有平台依存項,例如 implementation platform("org:platform:1.0")

  • 如果您在依存項上指定屬性,

  • 而且您對這些依存項使用 解析規則

如果您受到影響,請參閱 文件 以解決問題。

不建議使用

Gradle 6.6 中沒有不建議使用的項目。

從 6.4 及更早版本升級

不建議使用

內部類別 AbstractTask 已不建議使用

AbstractTask 是在公開 API 中可見的內部類別,作為公開類型 DefaultTask 的超類別。AbstractTask 將在 Gradle 7.0 中移除,而下列項目在 Gradle 6.5 中已不建議使用

  • 註冊類型為 AbstractTaskTaskInternal 的工作。您可以從工作註冊中移除工作類型,而 Gradle 會改用 DefaultTask

  • 註冊類型為 AbstractTask 的子類別,但不是 DefaultTask 的子類別的工作。您可以變更工作類型,改為延伸 DefaultTask

  • 在插件程式碼或建置指令碼中使用 AbstractTask 類別。您可以變更程式碼,改用 DefaultTask

從 6.3 及更早版本升級

潛在的重大變更

PMD 外掛程式預設需要 PMD 6.0.0 或更高版本

Gradle 6.4 預設啟用增量分析。增量分析僅在 PMD 6.0.0 或更高版本中可用。如果您要使用較舊的 PMD 版本,則需要停用增量分析

pmd {
    incrementalAnalysis = false
}

相依性鎖定的變更

在 Gradle 6.4 中,相依性鎖定 LockMode 的孵化 API 已變更。現在會透過 Property<LockMode> 設定值,而不是直接設定器。這表示必須更新 Kotlin DSL 中設定值的表示法

dependencyLocking {
    lockMode.set(LockMode.STRICT)
}

Groovy DSL 的使用者不應受到影響,因為 lockMode = LockMode.STRICT 表示法仍然有效。

已發布的元資料中的 Java 版本

如果 Java 函式庫是使用 Gradle 模組元資料發布的,則它支援的 Java 版本資訊會編碼在 org.gradle.jvm.version 屬性中。預設情況下,此屬性會設定為您在 java.targetCompatibility 中設定的內容。如果未設定,則會設定為執行 Gradle 的目前 Java 版本。變更特定編譯工作的版本,例如 javaCompile.targetCompatibility,不會對該屬性造成影響,如果未手動調整屬性,則會導致錯誤的資訊。此問題現已修正,且屬性預設值會變更為與編譯工作設定相關聯,而編譯工作會從已建置已發布 jar 的來源中產生。

具有自訂配置的 Ivy 儲存庫

6.0 到 6.3.x 含括的 Gradle 版本在於自訂存放庫配置中發佈時,可能會產生錯誤的 Gradle 模組元資料。從 6.4 開始,如果 Gradle 偵測到您正在使用自訂存放庫配置,將不再發佈 Gradle 模組元資料。

新的屬性可能會遮蔽建置指令碼中的變數

此版本在不同的地方引入了幾個新的屬性,例如 mainClassmainModulemodularity。由於這些名稱非常通用,因此您可能會在建置指令碼中將其中一個用作變數名稱。然後,新的屬性可能會以非預期的方式遮蔽您的其中一個變數,導致在存取屬性而不是同名的區域變數時建置失敗。您可以透過重新命名建置指令碼中對應的變數來修正此問題。

受到影響的是 application {}java {} 組態區塊內的組態程式碼、project.javaexec {} 中的 Java 執行設定,以及各種工作組態(JavaExecCreateStartScriptsJavaCompileTestJavadoc)。

不建議使用的項目

Gradle 6.3 和 6.4 之間沒有不建議使用的項目。

從 6.2 及更早版本升級

潛在中斷變更

IDEA 中可用的相依性較少

Gradle 不再將註解處理器類別路徑包含在 IDEA 中的已提供相依性中。IDEA 在編譯時看到的相依性與 Gradle 在解析編譯類別路徑(名為 compileClasspath 的組態)後看到的相同。這可防止註解處理器相依性外洩到專案的程式碼中。

在 Gradle 引入 增量註解處理器支援 之前,IDEA 需要所有註解處理器都在編譯類別路徑上,才能在 IDEA 中編譯時執行註解處理。由於 Gradle 有獨立的 註解處理器類別路徑,因此不再需要這樣做。當匯入具有註解處理器的 Gradle 專案時,註解處理器的相依性不會新增到 IDEA 模組的類別路徑中。

更新已綑綁的 Gradle 相依性

預設工具整合版本的更新

移除部分 32 位元作業系統的豐富主控台支援

Gradle 6.3 不支援 32 位元 Unix 系統和舊版 FreeBSD(早於 FreeBSD 10)的 豐富主控台。Microsoft Windows 32 位元不受影響。

Gradle 將持續在 32 位元系統上建置專案,但不再顯示豐富主控台。

不建議使用的項目

使用預設和檔案組態

幾乎每個 Gradle 專案都有 預設檔案 組態,它們是由 基本 外掛新增的。這些組態不再用於使用 變異感知相依性管理新發布外掛 的現代 Gradle 建置中。

雖然這些組態將暫時保留在 Gradle 中以維持向後相容性,但現在不建議使用它們來宣告相依性或解析相依性。

解析這些組態從來就不是預期的使用案例,而且只有在較早的 Gradle 版本中才有可能,因為在這些版本中 每個 組態都是可解析的。若要宣告相依性,請使用您所使用的外掛所提供的組態,例如 Java 函式庫外掛

從 6.1 及更早版本升級

潛在的重大變更

編譯和執行時期類別路徑現在預設要求函式庫變異

JVM 專案中的類別路徑現在明確要求 org.gradle.category=library 屬性。如果無法使用特定函式庫,這會產生更清晰的錯誤訊息。例如,當函式庫不支援所需的 Java 版本時。實際效果是,現在所有 平台相依性 都必須宣告為此類相依性。以前,當 platform() 關鍵字省略用於本機平台或使用 Gradle 模組元資料發布的平台時,平台相依性也會意外地運作。

專案根目錄 gradle.properties 的屬性外洩到 buildSrc 和包含的組建

Gradle 6.2 和 Gradle 6.2.1 中有一個回歸,導致在專案根目錄 gradle.properties 檔案中設定的 Gradle 屬性外洩到 buildSrc 組建和根目錄包含的任何組建。

如果 buildSrc 組建或包含的組建突然發現來自專案根目錄 gradle.properties 檔案的屬性具有意外或不相容的值,這可能會導致您的組建開始失敗。

此回歸已在 Gradle 6.2.2 中修復。

不建議使用

Gradle 6.1 和 6.2 之間沒有不建議使用的項目。

從 6.0 及更早版本升級

不建議使用

在任務完成之前查詢任務的對應輸出屬性

在任務完成之前查詢對應輸出屬性的值可能會導致奇怪的組建失敗,因為這表示可能會錯誤地使用過時的或不存在的輸出。此行為已不建議使用,並會發出不建議使用的警告。這將在 Gradle 7.0 中成為錯誤。

以下範例說明了此問題,其中在 Producer 執行之前會分析 Producer 的輸出檔案

class Consumer extends DefaultTask {
    @Input
    final Property<Integer> threadPoolSize = ...
}

class Producer extends DefaultTask {
    @OutputFile
    final RegularFileProperty outputFile = ...
}

// threadPoolSize is read from the producer's outputFile
consumer.threadPoolSize = producer.outputFile.map { it.text.toInteger() }

// Emits deprecation warning
println("thread pool size = " + consumer.threadPoolSize.get())

如果在 producer 完成之前查詢 consumer.threadPoolSize 的值,將會產生不建議使用的警告,因為尚未產生輸出檔案。

已中止的方法

以下方法已中止,不應再使用。它們將在 Gradle 7.0 中移除。

  • BasePluginConvention.setProject(ProjectInternal)

  • BasePluginConvention.getProject()

  • StartParameter.useEmptySettings()

  • StartParameter.isUseEmptySettings()

替代 JVM 外掛程式 (又稱「軟體模型」)

在 Gradle 2.x 中,基於「軟體模型」引進了一組替代外掛程式,供 Java 和 Scala 開發使用。這些外掛程式現已不建議使用,最終將會移除。如果您仍使用其中一個舊外掛程式 (java-langscala-langjvm-componentjvm-resourcesjunit-test-suite),請參閱建立 Java 和 JVM 專案文件,以確定哪個穩定的 JVM 外掛程式適合您的專案。

潛在中斷變更

ProjectLayout 不再作為服務提供給工作人員動作

在 Gradle 6.0 中,ProjectLayout 服務透過服務注入提供給工作人員動作。此服務允許可變狀態外洩到工作人員動作中,並引進一種方法,讓依賴關係在工作人員動作中保持未宣告狀態。

ProjectLayout 已從可用服務中移除。使用 ProjectLayout 的工作人員動作應改為注入 projectDirectorybuildDirectory 作為參數。

更新預設工具整合版本

發布 Spring Boot 應用程式

從 Gradle 6.2 開始,Gradle 會在您上傳前執行健全性檢查,以確保您不會上傳過期的檔案 (由其他組建產生的檔案)。這會對使用 components.java 組件上傳的 Spring Boot 應用程式造成問題

Artifact my-application-0.0.1-SNAPSHOT.jar wasn't produced by this build.

這是因為 Spring Boot 應用程式會停用主要的 jar 任務,而組件預期它會存在。由於 bootJar 任務預設使用與主要 jar 任務相同的檔案,因此 Gradle 的先前版本會

  • 發布過期的 bootJar 製成品

  • 或在尚未呼叫 bootJar 任務時失敗

解決方法是告訴 Gradle 要上傳什麼。如果您要上傳 bootJar,則需要設定傳出組態來執行此動作

configurations {
   [apiElements, runtimeElements].each {
       it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
       it.outgoing.artifact(bootJar)
   }
}

或者,您可能想要重新啟用 jar 任務,並加入具有不同分類項的 bootJar

jar {
   enabled = true
}

bootJar {
   classifier = 'application'
}