Maven 引入 POM 中未指定的依赖项
Maven pulling in dependency that is not specified in POM
我有一个由父 POM 和几个子模块组成的 Maven 项目。它编译并且 运行 在 Intellij 中很好(我假设它使用 javac
而不是 Maven)。
当我 运行 maven clean install
时,由于 "RequireUpperBoundDeps",构建失败,这从 the documentation 意味着构建期间解析的版本低于依赖项的版本同样的神器。这是(经过消毒的)输出:
[INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-maven) @ my-service ---
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:
Failed while enforcing RequireUpperBoundDeps. The error(s) are [
Require upper bound dependencies error for com.h2database:h2:1.3.168 paths to dependency are:
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.h2database:h2:1.3.168
and
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.example.libs:my-libs:2.0.0
+-com.h2database:h2:1.3.168 (managed) <-- com.h2database:h2:1.4.190
]
这似乎暗示 h2
是 my-service
的直接依赖项,但在任何 poms、模块或父项中都没有这样声明。 h2
应该只来自 my-libs
。此外,它声称 h2
是 "managed" 版本 1.3.168
。我不知道它从哪里得到这些信息。 my-libs
使用 h2
版本 1.4.190
.
我尝试从一个全新的 .m2
目录开始,从 my-libs
依赖项中排除 h2
,明确地将 h2
包含在 my-service
下(两个版本)。没有任何效果,从依赖项中排除 h2
会导致我的 类 之一与数据库交互(通过 JDBI)NoSuchPropertyException
。
如何让 maven 识别 h2
的正确版本以包含并成功构建我的项目?
我发现 h2
依赖项是从父 pom(my-service
的父级)引入的。 mvn dependency:tree
是骗人的,因为它显示 h2
是对 my-service
的直接依赖,在我看来这意味着它应该在 my-service
pom.xml 中声明。它没有在 my-service
pom 中声明 - 但是,它是在父 pom 中声明的。这就是冲突版本的来源。
在具有指定版本的 my-service
pom 中声明 h2
修复了上限依赖项错误。
一般答案:只需在 pom.xml
中声明缺少的依赖项
有人写了一篇很棒的文章 HERE,提供并理解正在发生的事情和可能的解决方案。这是摘要 -
对于错误中的这个 deps 树
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.example.libs:my-libs:2.0.0
+-com.h2database:h2:1.3.168 (managed) <-- com.h2database:h2:1.4.190
com.example.services:my-service
项目依赖于 com.h2database:h2
工件的 1.3.168
版本。此外,com.example.libs:my-libs
需要相同的工件但版本不同 - 1.4.190
.
在你的pom中声明com.h2database:h2:1.3.168
(升级场景)
注意:这可能不是适合所有项目的解决方案。
或者,您可以从 com.example.libs:my-libs
中排除 com.h2database:h2:1.4.190
。这样,com.example.libs:my-libs
将最终在 com.h2database:h2:1.3.168
(降级方案)
中使用旧版本
要执行后者,您的 pom 条目将如下所示:
<dependency>
<groupId>com.example.libs</groupId>
<artifactId>my-libs</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</exclusion>
</exclusions>
</dependency>
这是您必须根据您的项目做出的决定。我通常首先使用 mvn dependency:tree
.
进行一些调查
我有一个由父 POM 和几个子模块组成的 Maven 项目。它编译并且 运行 在 Intellij 中很好(我假设它使用 javac
而不是 Maven)。
当我 运行 maven clean install
时,由于 "RequireUpperBoundDeps",构建失败,这从 the documentation 意味着构建期间解析的版本低于依赖项的版本同样的神器。这是(经过消毒的)输出:
[INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-maven) @ my-service ---
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:
Failed while enforcing RequireUpperBoundDeps. The error(s) are [
Require upper bound dependencies error for com.h2database:h2:1.3.168 paths to dependency are:
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.h2database:h2:1.3.168
and
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.example.libs:my-libs:2.0.0
+-com.h2database:h2:1.3.168 (managed) <-- com.h2database:h2:1.4.190
]
这似乎暗示 h2
是 my-service
的直接依赖项,但在任何 poms、模块或父项中都没有这样声明。 h2
应该只来自 my-libs
。此外,它声称 h2
是 "managed" 版本 1.3.168
。我不知道它从哪里得到这些信息。 my-libs
使用 h2
版本 1.4.190
.
我尝试从一个全新的 .m2
目录开始,从 my-libs
依赖项中排除 h2
,明确地将 h2
包含在 my-service
下(两个版本)。没有任何效果,从依赖项中排除 h2
会导致我的 类 之一与数据库交互(通过 JDBI)NoSuchPropertyException
。
如何让 maven 识别 h2
的正确版本以包含并成功构建我的项目?
我发现 h2
依赖项是从父 pom(my-service
的父级)引入的。 mvn dependency:tree
是骗人的,因为它显示 h2
是对 my-service
的直接依赖,在我看来这意味着它应该在 my-service
pom.xml 中声明。它没有在 my-service
pom 中声明 - 但是,它是在父 pom 中声明的。这就是冲突版本的来源。
在具有指定版本的 my-service
pom 中声明 h2
修复了上限依赖项错误。
一般答案:只需在 pom.xml
中声明缺少的依赖项有人写了一篇很棒的文章 HERE,提供并理解正在发生的事情和可能的解决方案。这是摘要 -
对于错误中的这个 deps 树
+-com.example.services:my-service:1.0.0-SNAPSHOT
+-com.example.libs:my-libs:2.0.0
+-com.h2database:h2:1.3.168 (managed) <-- com.h2database:h2:1.4.190
com.example.services:my-service
项目依赖于 com.h2database:h2
工件的 1.3.168
版本。此外,com.example.libs:my-libs
需要相同的工件但版本不同 - 1.4.190
.
在你的pom中声明com.h2database:h2:1.3.168
(升级场景)
注意:这可能不是适合所有项目的解决方案。
或者,您可以从 com.example.libs:my-libs
中排除 com.h2database:h2:1.4.190
。这样,com.example.libs:my-libs
将最终在 com.h2database:h2:1.3.168
(降级方案)
要执行后者,您的 pom 条目将如下所示:
<dependency>
<groupId>com.example.libs</groupId>
<artifactId>my-libs</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</exclusion>
</exclusions>
</dependency>
这是您必须根据您的项目做出的决定。我通常首先使用 mvn dependency:tree
.