Java 在WAR中包含测试范围的可传递依赖项的Maven

Java 在WAR中包含测试范围的可传递依赖项的Maven,java,maven,Java,Maven,Maven 3.0.5和Maven 3.2.1 我有一个Maven项目,它是一个测试库聚合,目的是如果您依赖于一个范围为“test”的项目,那么您可以拥有您需要的所有测试库 我面临的问题是,其中一个测试库的依赖关系正在被纳入web项目的战争中 测试库聚合项目: <project ...> <groupId>com.group</groupId> <artifactId>test-lib</artifactId>

Maven 3.0.5和Maven 3.2.1

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

我面临的问题是,其中一个测试库的依赖关系正在被纳入web项目的战争中

测试库聚合项目:

<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>

com.group
测试库
测试库
1.0.0-SNAPSHOT
朱尼特
朱尼特
4.12
org.easymock
轻松的
3.3.1
org.apache.directory.server
apacheds测试框架
2.0.0-M19
网络项目:

<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>

com.group
网络项目
战争
网络项目
1.0.0-SNAPSHOT
com.group
测试库
1.0.0-SNAPSHOT
测试
文件上传
文件上传
1.1.1
在web项目中,我依赖于范围为“test”的测试库。当我查看依赖关系层次结构时,testlib的所有子依赖关系都正确地具有“test”的范围

apacheds测试框架依赖于commons io 2.4,commons fileupload依赖于commons io 1.1

我期望发生的是,commons io 2.4仅用于测试,而在构建战争时,只有common io 1.1包含在存档中。但实际情况是,战争中包括了commons io 2.4和commons io 1.1

我不能简单地将commons io从web项目中的测试库中排除,因为测试库需要2.4版本,目前我无法升级commons fileupload的版本,并且我不能允许在WAR中打包这两个JAR

在某些情况下,这似乎是Maven处理事务依赖关系的一个缺陷。这并不是我第一次让Maven对测试范围的依赖项进行不可逆的测试范围依赖项。我不知道在这里该做什么

提前谢谢。

所以我对你的问题有了一个确切的答案,就是你给出的依赖关系。如果我通过
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.
这正是我期望看到的


这使我得出结论,在你的情况下,一定有一些其他的依赖关系涉及。你能把你的项目简化成一个有效的例子吗?因此,我们能够深入到问题的根本原因。

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

您是否通过
mvn dependency:tree
在命令行上检查了此问题?此外,您是否检查了生成的WAR文件,该文件应通过
mvn clean package
在命令行上创建?如果您认为这是一个bug,请在用户邮件列表中报告它,或者更好地为此创建一个jira问题,并请包含一个产生此行为的完整示例。您确定
commons-io-2.4
不是作为另一个依赖项的传递依赖项拉入的吗?你能发布mvn dependency:tree的结果吗?不幸的是,我清理了我的工作区,然后行为停止了,在战争中我只得到了1.1。但是,io 2.4肯定是作为一个可传递的依赖项被引入的,因为我可以在Eclipse的依赖项层次结构中看到它的源代码。来源是ApacheDS。