是否存在一些方法可以避免在maven中使用不同的groupId重复的JAR而不解释重复项?

时间:2010-12-23 19:29:34

标签: maven

我有一个maven构建,它在类路径中生成一些重复的JAR。

以下是一些例子:

groupId: javax.xml.stream
artifactId: stax
version: 1.0-2

groupId: stax
artifactId: stax
version: 1.0.1

groupId: jboss
artifactId: javassist
version: 3.7.0 GA

groupId: javassist
artifactId: javassist
version: 3.9.0 GA

这些JAR不是直接从我的项目导入的,它们是传递依赖项。由于不同版本的groupId和artifactId不匹配,maven认为它们是独立的。

我可以追捕(可能正在使用某些工具)这些重复项并在pom.xml中明确排除它们。但是我不想手动搜索它们并排除它们,因为这会破坏maven的自动依赖管理,并且当某些依赖项升级并且转换依赖项再次不匹配时,这是一场噩梦。有一些方法可以使maven更智能并自动修复它吗?

2 个答案:

答案 0 :(得分:1)

回答这个问题。我发现没办法让maven更聪明,不得不追捕并手动排除每个重复的依赖。切换存储库以使用一组不会彼此混淆的存储库也有帮助,但这并不总是可行的,并且可能会产生破坏某些依赖关系的副作用。

答案 1 :(得分:0)

使用relocation机制有一种解决方法,但它可能仅适用于某些环境。

简而言之,重定位允许您“重定向”所有依赖项,例如: javax.xml.stream:staxstax:stax。问题是,在您自己的项目中添加重定位是您无法做到的。您必须向包含重定位信息的原始groupIdartifactId添加新版本。如果您有一个私有(例如公司)Maven存储库,您可以在那里添加它,或者如果只有少数开发人员,则可以使用开发人员本地存储库。在其他情况下,您可能对此解决方案不满意。

现在详情:

使用pom.xml创建一个新的Maven项目,如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- Coordinates of the artifact you want to replace -->
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax</artifactId>
    <!-- Some dummy version that would never be released -->
    <version>relocate-to-stax</version>

    <distributionManagement>
        <relocation>
            <!-- Coordinates of the new artifact -->
            <groupId>stax</groupId>
            <!-- artifactId stays the same → no need to specify again -->
        </relocation>
    </distributionManagement>
</project>

将此添加到您的存储库(例如,使用mvn install)。

在您的项目中,将此工件的新版本添加到dependencyManagement部分:

<project>
    <!-- ... -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.xml.stream</groupId>
                <artifactId>stax</artifactId>
                <version>relocate-to-stax</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

这样,javax.xml.stream:stax的所有依赖关系都将使用将重新定位到relocate-to-stax的“版本”stax:stax:relocate-to-stax。剩下要做的唯一事情是将所需的目标工件版本添加到dependencyManagement

<project>
    <!-- ... -->
    <dependencyManagement>
        <dependencies>
            <!-- ... -->
            <dependency>
                <groupId>stax</groupId>
                <artifactId>stax</artifactId>
                <version>1.0.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>