はじめに
Maven を利用している際に遭遇することのある "The POM for {dependency} is missing, no dependency information available" というエラーに関する備忘録です。
[WARNING] The POM for jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.0 is missing, no dependency information available
[WARNING] The POM for com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.18.2 is missing, no dependency information available
[WARNING] The POM for com.fasterxml.jackson.core:jackson-databind:jar:2.11.0 is missing, no dependency information available
[WARNING] The POM for jakarta.validation:jakarta.validation-api:jar:3.0.2 is missing, no dependency information available
エラーの原因
エラーメッセージは「dependency の pom.xml が無い」と言っていますが、実際に pom.xml の欠損がエラーの原因であるケースは稀だと思います。たいていは Transitive Dependency の解決がうまくいっていないことが原因です。
解決方法
問題が発生している状況に応じて対処方法が変わります。
例えば、Maven の dependency:go-offline を次のように起動して問題が発生した場合、
mvn dependency:go-offline
-DexcludeTransitive=true オプションを与えることで問題が解消するかもしれません。
mvn dependency:go-offline -DexcludeTransitive=true
また、Transitive Dependency の解決で問題を起こしている dependency を自分の pom.xml ファイルに追加することで問題を解消できるかもしれません。
私のプロジェクトでは、あるライブラリが間接的に Jakarta EE に依存していたために問題が発生しました。具体的には、io.swagger.parser.v3:swagger-parser が間接的に次の二つの Jakarta EE API を参照していました。
-
jakarta.xml.bind:jakarta.xml.bind-api(Jakarta XML Binding) -
jakarta.validation:jakarta.validation-api(Jakarta Validation)
[INFO] +- io.swagger.parser.v3:swagger-parser:jar:2.1.26:compile
[INFO] | +- io.swagger.parser.v3:swagger-parser-v2-converter:jar:2.1.26:compile
[INFO] | | +- io.swagger:swagger-core:jar:1.6.15:compile
[INFO] | | | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.0:compile
[INFO] | | | +- org.apache.commons:commons-lang3:jar:3.17.0:compile
[INFO] | | | \- io.swagger:swagger-models:jar:1.6.15:compile
[INFO] | | | \- io.swagger:swagger-annotations:jar:1.6.15:compile
[INFO] | | +- io.swagger:swagger-parser:jar:1.0.73:compile
[INFO] | | | \- io.swagger:swagger-parser-safe-url-resolver:jar:1.0.73:compile
[INFO] | | +- io.swagger:swagger-compat-spec-parser:jar:1.0.73:compile
[INFO] | | | +- com.github.java-json-tools:json-schema-validator:jar:2.2.14:compile
[INFO] | | | | +- com.github.java-json-tools:jackson-coreutils-equivalence:jar:1.0:compile
[INFO] | | | | +- com.github.java-json-tools:json-schema-core:jar:1.2.14:compile
[INFO] | | | | | +- com.github.java-json-tools:uri-template:jar:0.10:compile
[INFO] | | | | | \- org.mozilla:rhino:jar:1.7.7.2:compile
[INFO] | | | | +- joda-time:joda-time:jar:2.10.5:compile
[INFO] | | | | +- com.googlecode.libphonenumber:libphonenumber:jar:8.11.1:compile
[INFO] | | | | \- net.sf.jopt-simple:jopt-simple:jar:5.0.4:compile
[INFO] | | | +- com.github.java-json-tools:json-patch:jar:1.13:compile
[INFO] | | | | +- com.github.java-json-tools:msg-simple:jar:1.2:compile
[INFO] | | | | | \- com.github.java-json-tools:btf:jar:1.3:compile
[INFO] | | | | \- com.github.java-json-tools:jackson-coreutils:jar:2.0:compile
[INFO] | | | \- org.apache.httpcomponents:httpclient:jar:4.5.14:compile
[INFO] | | | +- org.apache.httpcomponents:httpcore:jar:4.4.16:compile
[INFO] | | | +- commons-logging:commons-logging:jar:1.2:compile
[INFO] | | | \- commons-codec:commons-codec:jar:1.11:compile
[INFO] | | +- io.swagger.core.v3:swagger-models:jar:2.2.29:compile
[INFO] | | \- io.swagger.parser.v3:swagger-parser-core:jar:2.1.26:compile
[INFO] | +- io.swagger.parser.v3:swagger-parser-v3:jar:2.1.26:compile
[INFO] | | +- io.swagger.core.v3:swagger-core:jar:2.2.29:compile
[INFO] | | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.18.2:compile
[INFO] | | | +- io.swagger.core.v3:swagger-annotations:jar:2.2.29:compile
[INFO] | | | \- jakarta.validation:jakarta.validation-api:jar:3.0.2:compile
[INFO] | | \- io.swagger.parser.v3:swagger-parser-safe-url-resolver:jar:2.1.26:compile
[INFO] | +- org.yaml:snakeyaml:jar:2.4:compile
[INFO] | \- commons-io:commons-io:jar:2.18.0:compile
この問題は、自分のプロジェクトの pom.xml に次の dependency 群を追加することで解消できました。
<!-- Jakarta (Bean) Validation -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- Jakarta XML Binding -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<scope>provided</scope>
</dependency>
ちなみに、Jakarta EE の BOM によりバージョン番号群が指定されているため、上記の dependency 群に <version> を含める必要はありませんでした。
<dependencyManagement>
<dependencies>
<!-- Jakarta EE -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-bom</artifactId>
<version>${jakarta.jakartaee-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
余談 (dependency:go-offline は完璧ではない)
「dependency:go-offline は完璧ではない」ということを理解するまで、問題解消に手間取りました。
dependency:go-offline を実行しても解決しきれない dependency については、dependency:get で個別に取得する必要がありました。
dependency:go-offline のドキュメントを読む限りでは、<scope>test</scope> の dependency も解決されるはずなのですが、実際の動作は異なっていたので、次のように dependency:get を用いてテスト関連の dependency を取得することにしました。
RUN \
mvn -B -C -e dependency:go-offline -DexcludeTransitive=true && \
mvn -B -C -e dependency:get\
-DgroupId=org.apache.maven.surefire\
-DartifactId=surefire-junit-platform\
-Dversion=3.5.3 && \
mvn -B -C -e dependency:get\
-DgroupId=org.junit.jupiter\
-DartifactId=junit-jupiter\
-Dversion=5.13.1 && \
mvn -B -C -e dependency:get\
-DgroupId=org.junit.platform\
-DartifactId=junit-platform-launcher\
-Dversion=1.13.1
これで dependency が全て解決されたので、verify 実行時に -o (--offline) オプションをつけることができるようになりました。
RUN mvn -B -C -e -o -Dmaven.javadoc.skip=true verify