【发布时间】:2019-10-07 23:42:59
【问题描述】:
我目前正在从 ant 切换到 maven,以获取由几个项目组成的大型库。我对 Maven 很陌生。
由于多个库需要相同的外部文件作为测试输入,我决定创建一个包含资源的单独项目 (Project1),如 here 所述。 Project1 只包含测试资源,没有别的,除了一个带有空 main 方法的类 project1.java。资源文件是具有任意文件扩展名的 ASCII 文本和二进制文件。现在,我想在测试其他项目时使用这些文件,例如项目2。我试图说明我的结构:
Root
|-Project1: Resources
| |-src
| | |-main
| |-test
| |-resources
| |-file1.txt
| |-file2.dat
| |-...
|-Project2: Consumer
| |-src
| | |-main
| |-test
| |...
| |-test1.java (requires file1.txt)
| |-test2.java (requires file2.dat)
| |-...
我在Project2 的 POM 中添加了 Project1 作为依赖项。这两个项目都是用 Netbeans 11 的 Clean 和 Build 构建的,所以我猜是 mvn clean, build & install。
我用Project1.class.getClassLoader().getResource([FILE]) 测试了Project1 中相关文件的存在,所有文件似乎都在正确的位置。但是,如果我在 Project2 中使用 Project1.class.getClassLoader().getResource([FILE]),例如找不到test1.java 相应的FILE。
System.out.println("1:" + Project1.class.getClassLoader().getResource(""));
System.out.println("2:" + Project1.class.getClassLoader().getResource("file1.txt"));
从test1.java 到Project2 给出:
1: file:[PATHTOPROJECT]/Project2/target/test-classes/
2: null
所以我尝试按照this description 中的方法进行操作。我的解释问题是,我没有plugin 来为maven-shared-archive-resources 执行executions,如消费者部分中所述。因此,我不知道把它们放在哪里。在示例中,执行是在 <groupId>org.codehaus.mojo</groupId> 和 <artifactId>sql-maven-plugin</artifactId> 内执行的。
我还查看了this thread,但我得到了Ant BuildException。
谁能这么好心地解释一个 maven 新手,我如何在不同的项目之间共享资源?还有其他更简单的方法吗?
POM.xml Project2
我试图将 POM.xml 剥离为 MWE。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- TOOL INFO -->
<groupId>org.test</groupId>
<artifactId>project2</artifactId>
<version>0.0.0.1</version>
<packaging>jar</packaging>
<!-- PROPERTIES -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- System -->
<java.version>1.8</java.version>
<junit.jupiter.version>5.3.1</junit.jupiter.version>
<junit.platform.version>1.0.0</junit.platform.version>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
<maven.plugin.compiler.version>3.8.1</maven.plugin.compiler.version>
<maven.plugin.enforcer.version>3.0.0-M2</maven.plugin.enforcer.version>
<maven.plugin.release.version>2.5.3</maven.plugin.release.version>
<maven.plugin.resources.remote.version>1.6.0</maven.plugin.resources.remote.version>
<maven.plugin.surefire.version>3.0.0-M3</maven.plugin.surefire.version>
<!-- Own -->
<project1.version>0.0.0.1</project1.version>
</properties>
<!-- DEPENDENCIES -->
<dependencies>
<dependency>
<groupId>org.test</groupId>
<artifactId>project1</artifactId>
<version>${project1.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- BUILD -->
<build>
<!-- PLUGINS -->
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.plugin.compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>${maven.plugin.enforcer.version}</version>
<executions>
<execution>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<configuration>
<rules>
<requireJavaVersion>
<version>${java.version}</version>
</requireJavaVersion>
</rules>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>${maven.plugin.release.version}</version>
<configuration>
<localCheckout>true</localCheckout>
<pushChanges>false</pushChanges>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.plugin.surefire.version}</version>
</plugin>
</plugins>
</build>
</project>
【问题讨论】: