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