我正在尝试将 jmockit-coverage-0.994.jar 依赖项从项目中移出到默认情况下未激活的某个配置文件,但无法将其插入配置文件依赖项的结果类路径的开头。
4 回答
从版本 2.0.9 开始,Maven 以与您的 pom.xml 中列出的相同方式对您的依赖项进行排序。话虽如此,一旦您开始从配置文件中合并依赖项,这一切都变得不平凡。您可能想检查您的有效 pom 以查看订单的外观:
mvn help:effective-pom -Pprofile
如果结果很糟糕,那么一种解决方法是使用dependency:build-classpath。另一种解决方案是使用范围而不是配置文件来执行包含。
从 Maven 2.0.9 开始,在构建类路径时确实保留了依赖的自然顺序,如 2.0.9 的发行说明中所述:
MNG-1412 / MNG-3111引入了类路径上依赖项的确定性排序。过去,使用自然集排序,这会导致奇怪的结果。现在从您的 pom 中保留了顺序,最后添加了由继承添加的依赖项。在具有冲突或重复依赖项的构建中,这可能会导致输出发生更改。简而言之,如果您对 2.0.9 有奇怪的问题,请查看依赖项,看看您是否在某处有冲突。
因此,通过在 POM 中按依赖顺序进行操作,您实际上可以操纵类路径(在使用配置文件时这可能会变得更加棘手,但是由于您没有提供有关实际问题的详细信息,因此很难提供更多指导)。
我已经回滚了上面使用活动配置文件的黑客,因为找到了更优雅的方式来解决我的问题。
问题的根源是传递依赖,因为使用了一些我的 testutils 模块,它对 JUnit 具有编译范围依赖(必须在类路径中的 JMockit 之后),而在父 POM 中,测试依赖定义如下:
...
<dependencies>
<dependency>
<groupId>mockit</groupId>
<artifactId>jmockit</artifactId>
<version>0.994</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<profiles>
<profile>
<id>coverage</id>
<dependencies>
<dependency>
<groupId>mockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>0.994</version>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
...
找到的解决方案是将 JUnit 范围从测试替换为提供。
这是更好的技巧吗?