如何使maven从/ src / test / resources而不是/ src / main / resources获取依赖项目的资源?

时间:2013-05-16 15:41:05

标签: maven jar resources dependencies

我在论坛上搜索了我的问题的答案,但我找不到它。我的问题是:

我有两个项目:ProjectA和ProjectB。 ProjectB使用ProjectA。在ProjectA中,我有两个文件夹: / src / main / resources和/ src / test / resources。 在ProjectB中我运行:mvn clean install。我想,在测试阶段,ProjectB中的类使用/ src / test / resources中的资源而不是/ src / main / resources。

这是我试过的: http://www.waltercedric.com/java-j2ee-mainmenu-53/361-maven-build-system/1349-maven-reusing-test-classes-across-multi-modules-projects.html

它类似于我的问题,但是在为ProjectA配置了test-jar目标之后,ProjectB仍然运行测试,ProjectA中的类使用/ src / main / resources中的属性而不是/ src / test /资源。

我在ProjectA中的pom.xml看起来像:

<project ...>
    <parent>
        ...
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>ProjectA</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        ...
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

在ProjectB中,我的pom.xml看起来像:

<project ...>
    <parent>
        ...
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ProjectB</artifactId>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.sensano</groupId>
            <artifactId>ProjectA</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>ProjectA</groupId>
            <artifactId>ProjectA</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>test</scope>
            <type>test-jar</type>
        </dependency>
    </dependencies>

</project>

有方法吗? 任何帮助将不胜感激!

此致
Mateusz Moroz

1 个答案:

答案 0 :(得分:10)

src/main/resources打包到名为ProjectA.jar的jar文件中,作为以下结构

ProjectA.jar
|`-com
|  `-sensano
|    `-foo
`-[the resource form src/main/resources]

遗憾的是,src/test/resources也被打包到名为ProjectA-tests.jar的jar文件中,作为以下结构。

ProjectA-tests.jar
|`-com
|  `-sensano
|    `-foo
`-[the resource form src/test/resources]

如果您需要的资源名称与src/main/resourcessrc/test/resources的名称相同。可能会有一些类加载器问题。恕我直言,最近的胜利。

由于您将ProjectA放在ProjectA-tests之前,因此可能是ProjectBsrc/main/resources使用ProjectA的根本原因,因为它是ProjectA-tests最接近。

请尝试将ProjectA放在<dependencies> <dependency> <groupId>com.sensano</groupId> <artifactId>ProjectA</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>test</scope> <type>test-jar</type> </dependency> <dependency> <groupId>com.sensano</groupId> <artifactId>ProjectA</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> 之前进行交换,如下所示: -

ProjectA-tests

最近的是ProjectBsrc/test/resources应该使用{{1}}。

我希望这可能有所帮助。