カスタマイズ可能なオープンソースのビルド自動化ツールであるGradleがバージョン6.0をリリースした。依存性管理の大幅な改善、javadocおよびソースjarのデフォルトサポート、JavaコードとGroovyコードのインクリメンタルコンパイルの高速化などを実現している。最新リリースである6.1.1では、リロケータブルな依存性キャッシュをサポートすることにより、エファメラル(ephemeral)CIビルドの高速化も図られている。
Gradleの依存性管理は、バージョン6で大きく改善された。依存性管理に関して一般的に使用される用語やユースケースが見つやすくなるように、ドキュメントも再構成されている。
Apache MavenのPOMファイルに似た形式のGradle Module Metadataが、Mavenあるいはivyベースのパブリッシュプラグインを使用する場合に、デフォルトでパブリッシュされるようになった。このメタデータに基づくことで、プラットフォームと呼ばれる、共有を目的としたモジュールセット間でのバージョン共有のリコメンドが可能になる。
新たに導入されたコンポーネントケーパビリティ(component capabilities)は、相互排他的な依存関係に関わるコンフリクトの検出と解決に使用される。"ケーパビリティ"はロギングなどの機能を表すもので、ひとつないし複数のモジュールやライブラリによって提供される。ケーパビリティを使用することで、Gradleの依存性管理エンジンが依存性グラフから互換性のないケーパビリティを検出したり、あるいは依存性グラフ上の同じケーパビリティを提供するモジュールをユーザが選択したりすることが可能になる。
例えば、SLF4J APIライブラリとApache ZooKeeperライブラリに依存するモジュールがあって、SLF4J実装ライブラリとしてJDKロギングを使用したい場合、ZooKeepr自体がSLF4J実装ライブラリとしてLog4Jを使用しているため、モジュールのクラスパスには2つのSLF4J実装が存在することになる。この場合、JDKロギングとLog4Jライブラリが同じケーパビリティを提供するものであることを示すコンポーネントケーパビリティルールを記述することにより、Gradleが事前にコンフリクトを検出することが可能になる。
さらにGradleには依存関係制約(dependency constraints)という概念があり、宣言されたすべての制約を満足する推移的依存関係の最新バージョンを選択することが可能である。
Gradle 6は、Javadoc jarとソースコードjarを自動生成して公開する機能を備えている。Gradle Module MetadataでこれらJarの情報を公開することも可能だ。この機能は、JavaおよびJavaライブラリプロジェクトで利用できる。
java {
withJavadocJar()
withSourcesJar()
}
Gradle 6では、コード変更の影響範囲を分析し、他のクラスの実装詳細であるクラスを再コンパイル対象から除外することにより、JavaコードとGroovyコードのインクリメンタルコンパイルが高速化されている。また、コンパイル回避(compilation avoidance)機能を使用して、他プロジェクト内のクラスの再コンパイルをスキップする。複数のモジュールによる複雑な依存性チェーンを持った大規模プロジェクトでは、この拡張によって多くの再コンパイルが回避されるため、インクリメンタルコンパイルのスピードアップが実現する。
バージョン6.1を初めて実行すると、Gradleの依存性キャッシュのコピーが作成されて、エファメラル(ephemeral)ビルドエージェントで使用できるようになる。エージェントはこのコピーを使って、以前にダウンロードされた依存関係を再利用することで、ビルドプロセスを高速化することができる。エファメラルビルドエージェントは、一度だけ使用されて、ビルド完了後に破棄されるエージェントである。状態を持たないため、ビルド毎にリモートリポジトリから依存関係をダウンロードしなければならないのだが、既存の依存性キャッシュをコピーすることで、すべての依存関係をダウンロードするコストを払う必要がなくなる。
Gradle 6で注目すべき特徴としてはその他に、JDK 13のサポート、ビルドの完全性を保護するためのセキュリティの改善、複数言語を使用したJVMビルドでの言語間のコンパイル順序の定義が可能になったこと、Gradleプラグイン開発者やツーリング提供者向けの改善などがある。