我有一个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更智能并自动修复它吗?
答案 0 :(得分:1)
回答这个问题。我发现没办法让maven更聪明,不得不追捕并手动排除每个重复的依赖。切换存储库以使用一组不会彼此混淆的存储库也有帮助,但这并不总是可行的,并且可能会产生破坏某些依赖关系的副作用。
答案 1 :(得分:0)
使用relocation机制有一种解决方法,但它可能仅适用于某些环境。
简而言之,重定位允许您“重定向”所有依赖项,例如: javax.xml.stream:stax
到stax:stax
。问题是,在您自己的项目中添加重定位是您无法做到的。您必须向包含重定位信息的原始groupId
和artifactId
添加新版本。如果您有一个私有(例如公司)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>