【问题标题】:Maven: Sharing resources between projectsMaven:在项目之间共享资源
【发布时间】: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.javaProject2 给出:

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>

【问题讨论】:

    标签: java maven resources


    【解决方案1】:

    更改项目1中资源的位置。注意,从test目录移动到main

    |-Project1: Resources
    | |-src
    | | |-main
    |     |-resources
    |       |-file1.txt
    |       |-file2.dat
    |       |-...
    

    然后,在项目 2 的 POM 中,添加项目 1 作为测试依赖项:

        <dependency>
            <groupId>org.test</groupId>
            <artifactId>project1</artifactId>
            <version>${project1.version}</version>
            <scope>test</scope>
        </dependency>
    

    【讨论】:

    • 不会工作,因为资源是 src/main/resources 的一部分,没有打包到测试 jar 中,除此之外还不够。
    • 资源被打包到 project1.jar 中(无论工件名称是什么)。然后,我们将 project1.jar 添加到 project2 的依赖项中,作为测试依赖项。我们已经将这种方法用于其他事情并且效果很好。
    • @user944849 谢谢,现在我至少看到了 project2 中的文件。但是,当我想使用 File file = new File(Project1.class.getClassLoader().getResource("file1.txt").getFile()); 创建一个 ew File 对象时,我得到一个 path syntax wrong 错误。谷歌搜索后我会发布一个后续问题
    • 后者可以使用stackoverflow.com/a/35466006/3154817的方法修复
    【解决方案2】:

    不要共享资源,而是创建另一个名为“onlyresources”或类似名称的项目,并在项目内部只保留那些*.txt、*.dat 文件。其他项目将依赖于上述定义的名为“onlyresources”的项目。如果是多模块 maven 项目,请确保将依赖项添加到其他项目。这个项目我的意思是“onlyresources”应该是第一个应该首先构建的项目。

    【讨论】:

    • 您好,感谢您的提示。 Project1 仅包含测试资源。没有其他的。我确实将它添加为Project2 POM 的依赖项。但是,Maven 不应该处理正确的构建顺序吗?
    • 如果您提供 pom.xml,我们将能够为您提供帮助。您必须在模块部分定义模块名称。
    • 我添加了 pom 的精简版本,希望包含相关部分。
    • 首先使用 mvn clean install 构建项目 Project1,然后尝试使用相同的命令运行第二个项目。但是,您可以创建一个多模块 Maven 项目。检查此链接。 websystique.com/maven/…
    • 我在问题中添加了有关我的构建过程的信息
    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多