Closed6

Toolchain について調べて見る

maxfie1dmaxfie1d

複数のプロジェクトに取り組む場合、Java言語の複数のバージョンとやり取りする必要があります。単一のプロジェクトでも、後方互換性の要件により、コードベースの異なる部分が特定の言語レベルに固定される場合があります。これは、同じツールの異なるバージョン(ツールチェーン)を、プロジェクトをビルドする各マシンにインストールおよび管理する必要があることを意味します。

Javaツールチェーンとは、通常、ローカルのJREまたはJDKのインストールを介して環境によって提供される、Javaプロジェクトをビルドおよび実行するためのツールセットです。コンパイルタスクでは、javacがコンパイラとして使用され、テストと実行タスクではjavaコマンドが使用され、javadocはドキュメントを生成するために使用されます。

デフォルトでは、Gradleは自身を実行するためのJavaツールチェーンとJVMプロジェクトをビルドするために同じJavaツールチェーンを使用します。ただし、これは必ずしも望ましいわけではありません。異なる開発者マシンやCIサーバーで異なるJavaバージョンでプロジェクトをビルドすると、予期しない問題が発生する場合があります。さらに、Gradleを実行するのにサポートされていないJavaバージョンでプロジェクトをビルドしたい場合があります。

ビルドの再現性を向上させ、ビルド要件を明確にするために、Gradleはプロジェクトレベルとタスクレベルの両方でツールチェーンを設定することができます。

maxfie1dmaxfie1d

Toolchains for projects

Java言語のバージョンをjava拡張ブロックで宣言することにより、プロジェクトで使用するツールチェーンを定義することができます。

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

ビルドを実行する(例:gradle checkを使用する)と、Gradleがビルドを実行するあなたや他の人に対して、次のことを行います。

  • Gradleは、定義されたツールチェーンを使用するように、すべてのコンパイル、テスト、およびjavadocタスクを設定します。
  • Gradleは、ローカルにインストールされたツールチェーンを検出します。
  • Gradleは、要件に合ったツールチェーンを選択します(上記の例ではJava 17の任意のツールチェーン)。
  • 一致するツールチェーンが見つからない場合、Gradleは、構成されたツールチェーンのダウンロードリポジトリに基づいて、自動的に一致するツールチェーンをダウンロードできます。
maxfie1dmaxfie1d

Selecting toolchains by vendor

ビルドに使用されるJRE/JDKに特定の要件がある場合は、ツールチェーンのベンダーも定義することが望ましい場合があります。JvmVendorSpecには、Gradleが認識するよく知られたJVMベンダーのリストがあります。この方法の利点は、Gradleが、JVMがベンダー情報をエンコードする方法に関するJDKバージョン間の不一致を自動的に処理できることです。

maxfie1dmaxfie1d

Auto detection of installed toolchains

デフォルトでは、Gradleは自動的にローカルのJRE/JDKのインストールを検出するため、ユーザーはさらなる設定を必要としません。以下は、JVMの自動検出がサポートする一般的なパッケージマネージャ、ツール、および場所のリストです。

JVM自動検出は以下を扱えます:

  • オペレーティングシステム固有の場所:Linux、macOS、Windows
  • パッケージマネージャ:Asdf-vm、Jabba、SDKMAN!
  • Mavenツールチェーン仕様
  • IntelliJ IDEAのインストール

検出されたすべてのJRE/JDKインストールの中から、ツールチェーン優先順位ルールに従って1つが選択されます。

maxfie1dmaxfie1d

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
このスクラップは2023/04/27にクローズされました