我有一个由父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,module或parent中都没有声明它。 h2
应该只来自my-libs
。此外,它声称h2
被“托管”为版本1.3.168
。我不知道从哪里得到这些信息。 my-libs
使用h2
版本1.4.190
。
我尝试从一个全新的.m2
目录开始,从h2
依赖项中排除my-libs
,在h2
下明确包含my-service
(两个版本) )。没有任何作用,并且从依赖项中排除h2
会在我的一个与数据库交互的类(通过JDBI)上产生NoSuchPropertyException
。
如何让maven识别要包含的h2
的正确版本并成功构建我的项目?
答案 0 :(得分:3)
我发现h2
依赖关系是从父pom(my-service
的父级)中提取的。 mvn dependency:tree
欺骗,因为它显示h2
是my-service
的直接依赖,在我看来,它应该在my-service
pom中声明。它没有在my-service
pom中显示 - 但是,它是在父pom中声明的。这就是冲突版本的来源。
使用指定版本在h2
pom中声明my-service
修复了上限依赖项错误。
答案 1 :(得分:1)
有人写了一篇很棒的文章HERE,该文章提供并了解正在发生的事情以及可能的解决方案。这是摘要-
对于此deps树中的错误
ss -tuple
+-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
工件的版本1.3.168
。另外,com.h2database:h2
需要相同的工件,但版本不同-com.example.libs:my-libs
。
在pom (升级方案)
中声明1.4.190
注意:这可能不适用于所有项目。
或者,您可以从com.h2database:h2:1.3.168
中排除com.h2database:h2:1.4.190
。这样,com.example.libs:my-libs
最终将在com.example.libs:my-libs
中使用较旧的版本(降级方案)
要进行后者,您的pom条目将如下所示:
com.h2database:h2:1.3.168
这是您必须根据项目做出的决定。我通常首先使用
<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>
做一些调查。
答案 2 :(得分:0)
一般答案:只需在pom.xml中声明缺少的依赖项