Maven包括WAR中的测试范围传递依赖关系

时间:2015-03-14 01:25:23

标签: java maven

Maven 3.0.5和Maven 3.2.1

我有一个Maven项目,它是一个测试库聚合,其目的是如果您依赖于具有“test”范围的项目,那么您可以拥有所需的所有测试库。

我遇到的问题是其中一个包含的测试库的依赖项被包含在Web项目的WAR中。

测试库聚合项目:

<project ...>
    <groupId>com.group</groupId>
    <artifactId>test-lib</artifactId>
    <name>test-lib</name>
    <version>1.0.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.directory.server</groupId>
            <artifactId>apacheds-test-framework</artifactId>
            <version>2.0.0-M19</version>
        </dependency>
    </dependencies>
</project>

网络项目:

<project ...>
    <groupId>com.group</groupId>
    <artifactId>web-project</artifactId>
    <packaging>war</packaging>
    <name>web-project</name>
    <version>1.0.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.group</groupId>
            <artifactId>test-lib</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</project>

在web项目中,我依赖于test-lib,其范围为“test”。当我查看依赖层次结构时,test-lib的所有子依赖项都正确地具有“test”范围。

apacheds-test-framework依赖于commons-io 2.4和commons-fileupload依赖于commons-io 1.1。

我期望发生的是commons-io 2.4仅用于测试,并且在构建WAR时,只有common-io 1.1包含在存档中。但实际上发生的事情是,commons-io 2.4 AND commons-io 1.1包含在WAR中。

enter image description here

我不能简单地从web-project中的test-lib中排除commons-io,因为test-lib需要2.4,我此时无法升级commons-fileupload的版本,而且我不能允许两个JAR都打包在WAR中

在某些情况下,这似乎是Maven处理trasitive依赖项的方式中的一个错误。这不是我第一次让Maven没有测试范围依赖的测试范围依赖关系。我不知道该怎么做。

提前致谢。

2 个答案:

答案 0 :(得分:0)

所以我对你的问题created an example based确切地说明了你给出的依赖关系。如果我通过mvn clean package(Maven 3.2.5)构建项目:

因此,如果我检查创建的war文件的内容,我得到以下内容:

$ unzip -t web/target/web-1.0.8-SNAPSHOT.war
Archive:  web/target/web-1.0.8-SNAPSHOT.war
    testing: META-INF/                OK
    testing: META-INF/MANIFEST.MF     OK
    testing: WEB-INF/                 OK
    testing: WEB-INF/classes/         OK
    testing: WEB-INF/lib/             OK
    testing: WEB-INF/lib/commons-fileupload-1.1.1.jar   OK
    testing: WEB-INF/lib/commons-io-1.1.jar   OK
    testing: WEB-INF/web.xml          OK
    testing: META-INF/maven/com.soebes.examples.so/web/pom.xml   OK
    testing: META-INF/maven/com.soebes.examples.so/web/pom.properties   OK
    testing: META-INF/INDEX.LIST      OK
No errors detected in compressed data of web/target/web-1.0.8-SNAPSHOT.war.

这正是我期望看到的。

这使我得出结论,在你的情况下,必须涉及一些其他依赖。你能将项目简化为一个有效的例子吗?因此,我们能够深入研究问题的根本原因。

答案 1 :(得分:0)

奇怪的是,清理完工作区后。问题停止了,我在WAR中只有commons-io 1.1。