gradleでビルドする場合、mavenリポジトリを利用することが多いと思います。mavenリポジトリではpomファイルにてモジュール自体の情報やその依存関係を表現します。(pomファイルは拡張子がpom、内容はXMLで記述されています)
そのため、モジュールの依存関係にライブラリモジュールがあると、pomファイルをダウンロードすることになるわけですが、ビルドログのダウンロード進捗をみていると、pomファイルの後にmoduleファイルをダウンロードしている場合があります。
これはなんでしょうか?
Download https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.pom, took 17 ms
Download https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.module, took 5 ms
これは gradle module metadataと呼ばれるもので、Gradle 5.3で1.0になり、6.0でデフォルト対応になっています。
pomファイルよりも詳細にモジュールの情報を記述できるようになっています。
ベースフォーマットもXMLからJSONになっており、よりモダンなファイル形式である印象がありますね。
現在、mavenリポジトリへのpublishを行うと自動的にmoduleファイルも公開されるようになっているので、多くのリポジトリで、moduleファイルを参照できるようになっています。
ライブラリモジュールの依存があると、gradleはpomファイルをとりにいきますが、moduleファイルがある場合、pomファイルにはgradle module metadataが一緒に公開されていることを知らせるマーカーコメントが含められています。
ダウンロードログにあった、kotlin-stdlibのpomファイルを見てみましょう
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- This module was also published with a richer model, Gradle metadata, -->
<!-- which should be used instead. Do not delete the following line which -->
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
<!-- that they should prefer consuming it instead. -->
<!-- do_not_remove: published-with-gradle-metadata -->
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>2.0.0</version>
<name>Kotlin Stdlib</name>
<description>Kotlin Standard Library</description>
<url>https://kotlinlang.org/</url>
このように先頭にコメントが挿入されていて、英語での説明の後、以下のようなマーカーがありますね。
<!-- do_not_remove: published-with-gradle-metadata -->
前段で全部説明されていますが、一緒によりリッチなメタデータがあるからそっち使ってねということですね。
moduleファイルは以下で、中を覗くと、pomファイルでは記述されていない様々な情報が含まれていることが分かります。
moduleファイルの公開が一般的になってきたので、いずれこちらがデフォルトになり、ライブラリモジュールの公開では実質必須になるかもしれないですね。
pomファイルよりmoduleファイルを優先する方法
これはあくまでこういう設定もできると言うだけで、推奨しているわけではないです。
まだmoduleファイルの参照がデフォルトにはなっていませんが、ほとんどのリポジトリでgradle module metadataが公開されていて、pomファイルのあとにmoduleファイルもダウンロードしないといけないというのはチョット無駄じゃないかな?などと思ってしまう場合もあります。
その場合、リポジトリ設定にて、 metadataSources
をつかって、利用するメタデータを設定できます。
以下のように設定するとmavenCentralのモジュールについてgradle module metadataを優先して取りに行くようになります。
dependencyResolutionManagement {
repositories {
mavenCentral {
metadataSources {
gradleMetadata()
mavenPom()
}
}
}
}