Maven依赖项在项目的目标目录中生成额外的JAR

时间:2011-11-09 13:52:38

标签: deployment maven dependencies

使用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。

感谢。

1 个答案:

答案 0 :(得分:1)

根据这个答案,假设您使用某种插件,如Maven Assembly插件或Maven EAR插件,将所有项目的依赖项复制到目标文件夹。

像Guice这样的依赖很可能会引入aopalliance:aopalliance工件(groupId:artifactId表示法),而你只是添加了对org.aopalliance:aopalliance的依赖。 Maven不知道它只是添加了两次相同的类文件 - 它检查groupId和artifactId以查看两个jar是否(假设)不同。

您有两种选择:

  1. 删除poms中的依赖项,或将groupId更改为aopalliance

  2. 跟踪aopalliance依赖关系的来源,然后从有问题的工件的传递依赖项中排除aopalliance工件。

  3. 您可以通过运行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库依赖于它。

    知道哪个库取决于aopallianceyou can add an exclusion in the POM。如果您将此排除和org.aopalliance依赖项的声明保留在同一个POM中,那将是首选。