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
]

这似乎暗示 h2my-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.

进行一些调查