如果你的依赖是在依赖关系树同级别,申报在你的pom的订货会胜利,因为每Maven Dependency Mediation DOC:
注意,如果两个依赖的版本是在同一深度依赖关系树,直到Maven 2.0.8它没有定义哪一个会赢,但自从Maven 2.0.9它是在声明中的顺序计数:第一个声明赢得
所以在你的情况下,两个依赖在依赖关系树(第一级,在POM中声明)和处于同一级别范围将(根据您发布的剪断)的方式存在,只要test
范围会,因为这样jar2
会赢,因为你在你的POM宣布它第一。
如果您希望文件始终从jar3
加载,但仅在测试期间,只需在您的依赖关系中首先声明jar3
即可。它不会影响最终的可交付成果(在test
作用域中),但它将定义到类路径的测试顺序,并为您提供预期的方案。你不需要Maven配置文件。
一个简单的测试用例来验证:
让我们来定义一个属性file.properties
到Maven项目的src\main\resources
。该文件看起来像项目resource-provider
(的artifactId)以下:
property=from-resource-provider
而且如下项目resource-provider2
(的artifactId):
property=from-resource-provider2
注:相同的文件名与不同的两个不同的项目内容。
然后在消费项目(resource-consumer
),我们可以有以下示例JUnit测试案例:
public class MainTest {
@Test
public void checkClassPath() {
InputStream is = MainTest.class.getResourceAsStream("/file.properties");
Scanner s = new Scanner(is);
System.out.println(s.nextLine());
}
}
对于下面的依赖关系到resource-consumer
:
<dependencies>
<dependency>
<groupId>com.sample</groupId>
<artifactId>resource-provider2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sample</groupId>
<artifactId>resource-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
测试执行的输出将是:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.sample.MainTest
property=from-resource-provider2
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 sec
因此,第一个de申报失败,resource-provider2
,赢了(注意范围,test
)。
改变依赖以:
<dependencies>
<dependency>
<groupId>com.sample</groupId>
<artifactId>resource-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sample</groupId>
<artifactId>resource-provider2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
反而会提供以下的输出:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.sample.MainTest
property=from-resource-provider
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.07 sec
注意:这个时候resource-provider
韩元,因为它被宣布第一,因为compile
范围也部分test
的范围,而相反的情况并非如此。
..谢谢你..很明确的解释.. –
@svsteja不客气。附注:当使用这种方法时(基于订购),我会建议添加评论给你的POM,以帮助其他开发人员或未来的维护和故障排除:) –