Toolchain について調べて見る
複数のプロジェクトに取り組む場合、Java言語の複数のバージョンとやり取りする必要があります。単一のプロジェクトでも、後方互換性の要件により、コードベースの異なる部分が特定の言語レベルに固定される場合があります。これは、同じツールの異なるバージョン(ツールチェーン)を、プロジェクトをビルドする各マシンにインストールおよび管理する必要があることを意味します。
Javaツールチェーンとは、通常、ローカルのJREまたはJDKのインストールを介して環境によって提供される、Javaプロジェクトをビルドおよび実行するためのツールセットです。コンパイルタスクでは、javacがコンパイラとして使用され、テストと実行タスクではjavaコマンドが使用され、javadocはドキュメントを生成するために使用されます。
デフォルトでは、Gradleは自身を実行するためのJavaツールチェーンとJVMプロジェクトをビルドするために同じJavaツールチェーンを使用します。ただし、これは必ずしも望ましいわけではありません。異なる開発者マシンやCIサーバーで異なるJavaバージョンでプロジェクトをビルドすると、予期しない問題が発生する場合があります。さらに、Gradleを実行するのにサポートされていないJavaバージョンでプロジェクトをビルドしたい場合があります。
ビルドの再現性を向上させ、ビルド要件を明確にするために、Gradleはプロジェクトレベルとタスクレベルの両方でツールチェーンを設定することができます。
Toolchains for projects
Java言語のバージョンをjava拡張ブロックで宣言することにより、プロジェクトで使用するツールチェーンを定義することができます。
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
ビルドを実行する(例:gradle checkを使用する)と、Gradleがビルドを実行するあなたや他の人に対して、次のことを行います。
- Gradleは、定義されたツールチェーンを使用するように、すべてのコンパイル、テスト、およびjavadocタスクを設定します。
- Gradleは、ローカルにインストールされたツールチェーンを検出します。
- Gradleは、要件に合ったツールチェーンを選択します(上記の例ではJava 17の任意のツールチェーン)。
- 一致するツールチェーンが見つからない場合、Gradleは、構成されたツールチェーンのダウンロードリポジトリに基づいて、自動的に一致するツールチェーンをダウンロードできます。
Selecting toolchains by vendor
ビルドに使用されるJRE/JDKに特定の要件がある場合は、ツールチェーンのベンダーも定義することが望ましい場合があります。JvmVendorSpecには、Gradleが認識するよく知られたJVMベンダーのリストがあります。この方法の利点は、Gradleが、JVMがベンダー情報をエンコードする方法に関するJDKバージョン間の不一致を自動的に処理できることです。
Auto detection of installed toolchains
デフォルトでは、Gradleは自動的にローカルのJRE/JDKのインストールを検出するため、ユーザーはさらなる設定を必要としません。以下は、JVMの自動検出がサポートする一般的なパッケージマネージャ、ツール、および場所のリストです。
JVM自動検出は以下を扱えます:
- オペレーティングシステム固有の場所:Linux、macOS、Windows
- パッケージマネージャ:Asdf-vm、Jabba、SDKMAN!
- Mavenツールチェーン仕様
- IntelliJ IDEAのインストール
検出されたすべてのJRE/JDKインストールの中から、ツールチェーン優先順位ルールに従って1つが選択されます。
Viewing and debugging toolchains
Gradleは、そのメタデータを含むすべての検出されたツールチェーンのリストを表示できます。
たとえば、プロジェクトのすべてのツールチェーンを表示するには、次のコマンドを実行します。
> gradle -q javaToolchains
+ Options
| Auto-detection: Enabled
| Auto-download: Enabled
+ AdoptOpenJDK 1.8.0_242
| Location: /Users/username/myJavaInstalls/8.0.242.hs-adpt/jre
| Language Version: 8
| Vendor: AdoptOpenJDK
| Architecture: x86_64
| Is JDK: false
| Detected by: system property 'org.gradle.java.installations.paths'
+ Microsoft JDK 16.0.2+7
| Location: /Users/username/.sdkman/candidates/java/16.0.2.7.1-ms
| Language Version: 16
| Vendor: Microsoft
| Architecture: aarch64
| Is JDK: true
| Detected by: SDKMAN!
+ OpenJDK 15-ea
| Location: /Users/user/customJdks/15.ea.21-open
| Language Version: 15
| Vendor: AdoptOpenJDK
| Architecture: x86_64
| Is JDK: true
| Detected by: environment variable 'JDK16'
+ Oracle JDK 1.7.0_80
| Location: /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre
| Language Version: 7
| Vendor: Oracle
| Architecture: x86_64
| Is JDK: false
| Detected by: macOS java_home