使用Maven构建项目时,我的目标目录中有2个罐子: aopalliance-aopalliance-1.0.jar org.aopalliance-aopalliance-1.0.jar
我怀疑我的pom.xml中的以下依赖是负责任的
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
但我不明白为什么会这样。我在我的pom.xml中有一些其他依赖项以相同的方式定义,并且有问题的JAR安装在Nexus中,就像其他JAR一样,但其他依赖项不会导致我的目标目录中的JAR。
感谢。
答案 0 :(得分:1)
根据这个答案,假设您使用某种插件,如Maven Assembly插件或Maven EAR插件,将所有项目的依赖项复制到目标文件夹。
像Guice这样的依赖很可能会引入aopalliance:aopalliance
工件(groupId:artifactId表示法),而你只是添加了对org.aopalliance:aopalliance
的依赖。 Maven不知道它只是添加了两次相同的类文件 - 它检查groupId和artifactId以查看两个jar是否(假设)不同。
您有两种选择:
删除poms中的依赖项,或将groupId更改为aopalliance
。
跟踪aopalliance
依赖关系的来源,然后从有问题的工件的传递依赖项中排除aopalliance
工件。
您可以通过运行mvn dependency:tree
或使用M2Eclipse插件(打开POM并查看“依赖关系层次”选项卡)来执行(2)。这是dependency:tree命令的一些示例输出:
mygroup:earproj:pom:2.3.1-SNAPSHOT
+- mygroup:wslib:jar:2.3.1-SNAPSHOT:compile
| +- axis:axis:jar:1.4:compile
| | +- org.apache.axis:axis-saaj:jar:1.4:compile
| | +- axis:axis-wsdl4j:jar:1.5.1:runtime
| | +- commons-logging:commons-logging:jar:1.0.4:runtime
| | \- commons-discovery:commons-discovery:jar:0.2:runtime
| +- org.apache.axis:axis-jaxrpc:jar:1.4-noqname:compile
| \- commons-httpclient:commons-httpclient:jar:3.0.1:runtime
| \- commons-codec:commons-codec:jar:1.2:runtime
+- mygroup:commonclass:2.3.1-SNAPSHOT:compile
看一下commons-logging,例如,我们可以看到axis:axis库依赖于它。
知道哪个库取决于aopalliance
,you can add an exclusion in the POM。如果您将此排除和org.aopalliance
依赖项的声明保留在同一个POM中,那将是首选。