我有一个 Maven 项目,由一个父 POM 和几个子模块组成。它在 Intellij 中编译并运行良好(我假设它使用javac而不是 Maven)。
当我运行时maven clean install,构建由于“RequireUpperBoundDeps”而失败,这从文档中意味着构建期间解析的版本低于同一工件的依赖项版本。这是(经过清理的)输出:
[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“管理”为 version 1.3.168。我不知道它从哪里得到这些信息。my-libs使用h2版本1.4.190.
我尝试从一个全新的.m2目录开始,排除依赖h2项my-libs,明确包括在(两个版本)h2下my-service。h2没有任何效果,从依赖关系中排除会导致NoSuchPropertyException我的一个与数据库交互的类(通过 JDBI)。
如何让 Maven 识别h2要包含的正确版本并成功构建我的项目?
pap*_*gee 10
有人在这里写了一篇出色的文章,提供并理解正在发生的事情和可能的解决方案。这是总结 -
对于错误中的这个 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项目依赖于工件1.3.168的版本com.h2database:h2。另外,com.example.libs:my-libs需要相同的工件但版本不同 - 1.4.190.
com.h2database:h2:1.3.168在你的 pom 中声明(升级场景)
注意:这可能并不适合所有项目。
或者,您可以com.h2database:h2:1.4.190从 中排除com.example.libs:my-libs。这样,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。
我发现h2依赖项是从父 pom( 的父项my-service)中拉入的。mvn dependency:tree是欺骗性的,因为它显示h2为对 的直接依赖my-service,在我看来,这意味着它应该在 pom.xml 中声明my-service。它没有在my-servicepom 中声明 - 然而,它是在父 pom 中声明的。这就是冲突版本的来源。
h2在 pom 中声明指定版本修复my-service了上限依赖项错误。
| 归档时间: | 
 | 
| 查看次数: | 12434 次 | 
| 最近记录: |