gpt4 book ai didi

java - 多模块项目中的maven测试资源

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:09:41 24 4
gpt4 key购买 nike

我正在重构一个多模块项目,该项目依赖于一个模块——shared-resources——主要资源和测试资源。

parent
|_ shared-resources
|_ child

目前,一个模块通过使用maven-resource-plugin来包含shared-resources

当前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 ”和“Share test resources between maven projects ") 建议。

新的 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>
...

然而,当我为 child 运行测试时,测试是否缺少资源。

我以多种方式运行我的构建:

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' 其中 properties access test 做的是:

  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)));
}
}

shared-resources/src/test/resources/ 中有一个相应的 test.properties (根据我对上述配置的理解应该包括在内),而是测试总是以“文件应该存在”而失败。

我可以验证我的本地 .m2 存储库是否包含包含预期测试资源的测试 jar。

我在这里做错了什么?

最佳答案

您将文件放入单独的模块中。这意味着它现在将被嵌入到 JAR 文件中。您不能再从中创建 File。但是您可以通过 URI 和 InputStream 访问它:

getClass().getClassLoader().getResource("test.properties").openStream()

生产 资源更有趣。如果您运行 mvn test,Maven 将使用 target/classes/test.properties。而这个File一起工作。但是,如果您改为运行 mvn package - 它不会。因为在 package 之后,Maven 会将 jar 文件放入类路径而不是 target/classes

关于java - 多模块项目中的maven测试资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47504310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com