Maven依赖项拉取了错误的依赖项。

11

下面的依赖项会拉取另一个依赖项:httpcore.4.1.4

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.2</version>
  <scope>compile</scope>
</dependency>

这样做会在部署期间抛出 ClassDefNotFound
但是,使用httpcore.4.2,一切都能正常工作。
我甚至直接将这两个依赖项添加到我的pom文件中:
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.2</version>
  <scope>compile</scope>
</dependency>
        
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpcore</artifactId>
  <version>4.2</version>
  <scope>compile</scope>
</dependency>

这并没有改变任何事情,我仍旧面临着同样的问题: Maven将httpcore.4.2降级为httpcore.4.1.2

dependencyManagement看起来像这样:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpcore</artifactId>
      <version>4.2</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

2
运行命令 $ mvn dependency:tree -Dverbose -Dincludes=httpcore,它将显示依赖树中所有版本的 httpcore,包括那些被省略的版本。它会告诉你为什么会得到版本号为 "4.1.4" 的信息以及它所在的位置。 - Hong
1个回答

15

你可能有一个传递性依赖,其中其他依赖项依赖于你不想要的版本。

要获取所有依赖项(直接和传递性)的概述,请尝试:

mvn dependency:tree

如果您发现了同一依赖项的不同版本之间的崩溃,那么您应该做的第一件事情是确定这个崩溃是否很关键(您是否需要同时使用两个版本?)。如果不需要,就将其升级,使最低依赖版本等于最高版本。如果它是一个传递性依赖项,则考虑升级此版本。

如果您只想锁定到特定版本的依赖项,您有几个选择:

排除传递性依赖项:

<dependency>
  <groupId>com.something</groupId>
  <artifactId>something</artifactId>
  <exclusions>
    <exclusion>
      <groupId>com.somethingElse</groupId>
      <artifactId>somethingElse</artifactId>
    </exclusion>
  </exclusions>
</dependency>

包括一个特定的版本:

<dependency>
  <groupId>com.somethingElse</groupId>
  <artifactId>somethingElse</artifactId>
  <version>2.0</version>
</dependency>

在您的pom中明确添加的任何依赖版本都将覆盖同一groupId / artifactId的任何传递性依赖项的版本。

尽管有点令人费解,但您应该尝试获取与相同版本传递依赖项的版本兼容的依赖项。


我发现有冲突。我该如何覆盖版本以获取最新的版本,或者可以并列显示吗? - DarthVader
根据我的经验,将它们并排放置效果不太好,因为通常最终会尝试调用错误的依赖项。但是哪个依赖关系取决于您不想要的版本? - Tobb
1
我想要的是httpcore.4.2而不是httpcore.4.1.*。我添加了dependencyManagement标签,这样可以吗?请查看我的编辑。 - DarthVader
我在Eclipse中查看它,然后发现了冲突。 - DarthVader
如果这只是一个Eclipse的问题(它不是相关Maven项目的一部分),那么你应该从Eclipse Java构建路径中将其移除(项目->属性)。 - Tobb
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接