Maven拉入POM中未指定的依赖项

时间:2016-05-16 23:48:47

标签: java maven h2

我有一个由父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
]

这似乎意味着h2my-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的正确版本并成功构建我的项目?

3 个答案:

答案 0 :(得分:3)

我发现h2依赖关系是从父pom(my-service的父级)中提取的。 mvn dependency:tree欺骗,因为它显示h2my-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中声明缺少的依赖项