解决maven传递依赖冲突

时间:2014-01-30 08:57:10

标签: maven

我的项目依赖于第三方库,依赖关系在我的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库依赖于y在其pom中定义的y:

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

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

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

我的问题是:

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

  2. 有没有办法解决这个问题而不向 thirdparty:y:1.0.0 添加显式依赖项到我的项目的pom?

1 个答案:

答案 0 :(得分:0)

首先确保您真的需要快照版本。应该正常发布版本(没有-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>

我希望这可以帮助你。