【问题标题】:Resolve maven transitive dependency conflict解决maven传递依赖冲突
【发布时间】:2014-01-30 08:57:10
【问题描述】:

我的项目依赖于一个第三方库,这个依赖在我的 POM 中是这样定义的:

<dependency>
    <groupId>thirdparty</groupId>
    <artifactId>main</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

这个第三方主库又依赖于其他两个库,下面是它的pom中定义的依赖管理的一部分:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>thirdparty</groupId>
            <artifactId>x</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>thirdparty</groupId>
            <artifactId>y</artifactId>
            <version>1.0.0</version>
        </dependency>
        ...

现在第三方 x 库在其 pom 中定义了对 y 的依赖,如下所示:

<dependency>
    <groupId>thirdparty</groupId>
    <artifactId>y</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

注意快照版本!这看起来像是第三方 pom 中的一个问题,但我无法控制它。

有趣的是,如果您尝试构建它使用的主要第三方项目(解析并安装到本地 repo)正确的 thirdparty:y:1.0.0 版本的工件。但是当我构建我的原始项目时,它会尝试解析第三方的快照版本:y。

我的问题是:

  1. 为什么会发生这种情况?我确信 maven 应该选择最接近项目根目录的工件版本,在我的情况下是 1.0.0

  2. 有没有什么方法可以解决这个问题,而不需要向我的项目的 pom 中添加对 thirdparty:y:1.0.0 的显式依赖项?

【问题讨论】:

  • 您是否尝试使用thirdparty:main:1.0.0 而不是thirdparty:main:1.0.0-SNAPSHOT
  • 通常没有理由使用第三方库的快照版本。如果您想确保某个版本,您可以在自己的 pom 中指定您想要的版本(使用您想要的版本自己指定依赖项),并且绝对可以肯定,将其从依赖于它的依赖项中排除(应该不需要,但这样你就可以清楚地知道是什么导致它首先出现)。

标签: maven


【解决方案1】:

首先确保您确实需要快照版本。通常应该有一个发布版本(没有 -SNAPSHOT)。

如果你确实需要它,这应该可以解决问题:

<properties>
    <dependeny.main.version>1.0.0-SNAPSHOT</dependeny.main.version>
    <dependeny.x.version>1.0.0</dependeny.x.version>
    <dependeny.y.version>1.0.0</dependeny.y.version>
<properties>
<dependencies>
    ...
    <dependency>
        <groupId>thirdparty</groupId>
        <artifactId>main</artifactId>
    </dependency>
    <dependency>
        <groupId>thirdparty</groupId>
        <artifactId>x</artifactId>
    </dependency>
    <dependency>
        <groupId>thirdparty</groupId>
        <artifactId>y</artifactId>
    </dependency>
    ...
</dependencies>

<dependencyManagement>
    <dependencies>
        ...
        <dependency>
            <groupId>thirdparty</groupId>
            <artifactId>main</artifactId>
            <version>${dependeny.main.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>thirdparty</groupId>
                    <artifactId>x</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>thirdparty</groupId>
                    <artifactId>y</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>thirdparty</groupId>
            <artifactId>x</artifactId>
            <version>${dependeny.x.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>thirdparty</groupId>
                    <artifactId>y</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>thirdparty</groupId>
            <artifactId>y</artifactId>
            <version>${dependeny.y.version}</version>
        </dependency>
        ...
    </dependencies>
</dependencyManagement>

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多