我正在重构一个多模块项目,它依赖于一个模块 - shared-resources
- 用于主资源和测试资源。
parent
|_ shared-resources
|_ child
目前,模块使用shared-resources
包含maven-resource-plugin
。
当前child/pom.xml
:
...
<resources>
<resource>
<directory>../shared-resources/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>../shared-resources/src/test/resources</directory>
</testResource>
</testResources>
...
我想重构依赖关系,以便通过shared-resources
模块的jar和test-jar包装将它们包含在内,作为一些相关问题(例如“Specify common resources in a multi-module maven project”和“{{3 }}“) 建议。
新shared-resources/pom.xml
:
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
新child/pom.xml
:
...
<dependency>
<groupId>com.example</groupId>
<artifactId>shared-resources</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>shared-resources</artifactId>
<version>0.0.1</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
...
当我为孩子运行测试时,测试缺少资源。
我以各种方式运行我的构建:
maven clean test --projects child --also-make
maven clean install -DskipTests && mvn test --projects child
maven clean verify --projects child --also-make
我的权威测试已经mvn clean install -DskipTests -pl :child -am && mvn test -pl :child -Dtest='PropertiesAccessTest'
,其中属性访问测试执行:
public class PropertiesAccessTest {
@Test
public void resourceAccessible() throws URISyntaxException, IOException {
propertyExists(
"abcdef=12345",
"test.properties"
);
}
private void propertyExists(String string, String fileName) throws IOException, URISyntaxException {
URL url = getClass().getClassLoader().getResource(fileName);
assertNotNull(url);
assertTrue("file should exist", new File(url.getFile()).exists());
assertTrue("file should contain property", Files.readAllLines(Paths.get(url.toURI()))
.stream().anyMatch(l -> l.contains(string)));
}
}
test.properties
中有一个对应的shared-resources/src/test/resources/
(应该包括我理解上面的配置),但测试总是失败,“文件应该存在。”
我可以验证我的本地.m2
存储库是否包含按预期包含测试资源的测试jar。
我在这里做错了什么?
答案 0 :(得分:1)
您将文件放入单独的模块中。这意味着它现在将嵌入到JAR文件中。您无法再创建File
了。但您可以通过URI和InputStream访问它:
getClass().getClassLoader().getResource("test.properties").openStream()
然而,使用生产资源更有趣。如果您运行target/classes/test.properties
,Maven将使用mvn test
。此将与File
一起使用。但是如果你改为运行mvn package
- 它不会。因为在package
之后,Maven会将jar文件放入classpath而不是target/classes
。