Gradle 8.0 におけるツールチェーンリポジトリの変更

blog1.mammb.com


TL;DR

Gradle 8.0 で以下のようなワーニングや

$ ./gradlew build --warning-mode all
Using a toolchain installed via auto-provisioning, but having no toolchain repositories configured. This behavior is deprecated. Consider defining toolchain download repositories, otherwise the build might fail in clean environments; see https://docs.gradle.org/8.0/userguide/toolchains.html#sub:download_repositories

以下のようなエラーが出た場合、

$ ./gradlew build

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:distTar'.
> Could not resolve all dependencies for configuration ':app:runtimeClasspath'.
   > Failed to calculate the value of task ':app:compileJava' property 'javaCompiler'.
      > No matching toolchains found for requested specification: {languageVersion=19, vendor=any, implementation=vendor-specific}.
         > No locally installed toolchains match (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:auto_detection) and toolchain download repositories have not been configured (see https://docs.gradle.org/8.0/userguide/toolchains.html#sub:download_repositories).

settings.gradle.kts に 以下を定義しましょう。

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0")
}


ツールチェーン と ツールチェーンリポジトリ

Gradle 6.7 で導入された toolchain を指定することで、コンパイル、テスト、javadoc タスク などに利用するツールチェーンを構成できるようになりました。

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(19))
    }
}

対象のツールチェーンがローカルに見つからない場合は自動的にダウンロードして利用可能になります。


Gradle 7.6 ではツールチェーンリポジトリが導入され、ダウンロードするツールチェーンのベンダなどを柔軟に定義できるようになりました。

例えば以下のようにして JVM ベンダを指定することができます。

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
        vendor.set(JvmVendorSpec.ADOPTIUM)
    }
}

ローカルで利用可能なツールチェーンが見つからない場合、Gradle はツールチェーンリポジトリの構成に従い自動的にJDKをダウンロードし、Gradle ユーザー ホーム ディレクトリにインストールします。


Gradle 8.0 からのツールチェーンリポジトリ

Gradle 8.0 からは、 デフォルトのツールチェーンプロビジョナーが提供されなくなり、ツールチェーン リポジトリを明示的に宣言する必要があります。

通常は settings.gradle.kts に Foojay Toolchains Plugin を定義しておくことで事足ります。

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0")
}

このプラグインは foojay Disco APIに基づくツールのダウンロードリポジトリ構成を提供します。

多くのツールベンダが様々なバージョンのJDKを提供するようになったため、プラグインとして外だし管理されるようになりました。という訳です。

なお、ローカルに存在する Gradle が検出したツールチェーンのリストは以下で確認できます。

$ ./gradlew -q javaToolchains

 + Options
     | Auto-detection:     Enabled
     | Auto-download:      Enabled

 + Eclipse Temurin JDK 18.0.2+9
     | Location:           ...\jdk-18.0.2+9
     | Language Version:   18
     | Vendor:             Eclipse Temurin
     | Architecture:       amd64
     | Is JDK:             true
     | Detected by:        Auto-provisioned by Gradle

 + Eclipse Temurin JDK 19.0.2+7
     | Location:           ...\jdk-19.0.2+7
     | Language Version:   19
     | Vendor:             Eclipse Temurin
     | Architecture:       amd64
     | Is JDK:             true
     | Detected by:        Auto-provisioned by Gradle