Как заставить maven взять ресурсы из /src/test/resources вместо/src/main/resources для зависимого проекта?

Я искал форум, чтобы найти ответ на мою проблему, но я не смог его найти. Моя проблема в том, что:

У меня есть два проекта: 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, ProjectB все еще запускает тесты на этом пути, эти классы в ProjectA используют свойства из /src/main/resources вместо/src/test/ресурсы.

Мой pom.xml в ProjectA выглядит следующим образом:

<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>

Есть ли способ Любая помощь будет оценена!

С уважением,
Матеуш Мороз

Ответ 1

src/main/resources упаковываются в файл jar с именем ProjectA.jar в виде следующей структуры

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

К сожалению, src/test/resources также упаковываются в файл jar с именем ProjectA-tests.jar в качестве следующей структуры.

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

Если требуемое имя ресурса имеет одно и то же имя как от src/main/resources, так и src/test/resources. Там может быть проблема с загрузчиком класса. ИМХО, ближайшая победа.

Поскольку вы помещаете ProjectA перед ProjectA-tests, то может быть основной причиной того, что ProjectB будет использовать src/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, а ProjectB должен использовать src/test/resources.

Надеюсь, это поможет.