【问题标题】:maven dependency pulling a wrong dependencymaven 依赖项拉出错误的依赖项
【发布时间】:2012-11-18 02:14:47
【问题描述】:

我有如下依赖:

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

当我部署 httpcore.4.2 时,这会拉下另一个依赖项 httpcore.4.1.4,它会抛出 ClassDefNotFound,一切正常。

我添加了两个依赖如下:

    <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>

仍然面临同样的问题,即:mvn 降低了httpcore.4.1.2 而不是httpcore.4.2

我该如何解决这个问题?

编辑:

已添加;

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

【问题讨论】:

  • $ mvn dependency:tree -Dverbose -Dincludes=httpcore,它将在依赖关系树中显示所有版本的httpcore,包括那些省略的。它会告诉您从哪里/为什么获得“4.1.4”版本

标签: java maven dependencies apache-httpcomponents


【解决方案1】:

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

要获得所有依赖项的概览,直接和传递,请尝试:

mvn 依赖:树

如果你发现同一个依赖的不同版本之间发生了崩溃,首先你应该弄清楚这个崩溃是否很严重(你需要两者吗?)如果不是,升级以便最低的依赖版本变得相等到最高。如果是传递依赖,请考虑升级 this 的版​​本。

如果你只想锁定特定版本的依赖,你有一些选择:

排除传递依赖:

<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 的任何传递依赖的版本。

虽然有点困惑,但您应该尝试获取兼容版本的依赖项,即具有相同版本传递依赖项的版本。

【讨论】:

  • 我看到有冲突。如何覆盖版本以获取最新版本,或者我可以并排吗?
  • 根据我的经验,让它们并排并没有那么好,因为它通常最终会试图调用错误的那个。但是哪个依赖取决于你不想要的版本?
  • 我想要 httpcore.4.2 而不是 httpcore.4.1.*。我添加了dependencyManagement 标记。这行得通吗?请看我的编辑。
  • 我在 Eclipse 中查看它。我看到了冲突。
  • 对你有好处。我看不到它,很难提供任何真正的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多