Как добавить другую папку исходного кода в Maven и скомпилировать ее в отдельную папку?
У меня есть папка src/test/java
по умолчанию для наших модульных тестов. Для тестов интеграции доступна отдельная папка src/integration/java
.
Я сконфигурировал maven-surefire-plugin
для выполнения тестов unit/integration в их соответствующих фазах. Это отлично работает, когда скомпилированные классы находятся в правильном каталоге. К сожалению, Maven поддерживает только одну тестовую исходную папку и одну тестовую выходную папку.
С плагином build-helper для mavens я мог бы добавить еще одну тестовую папку, но скомпилированные классы будут сгенерированы в test-classes
, но я хочу скомпилировать классы из src/integration/java
в target/integration-test-classes
. Возможно ли это?
src/test/java > target/test-classes
src/integration/java > target/integration-test-classes
PS: Мне не нравится это исключать/включать в базовое решение пакета (исключить все **/it/**
файлы из тестовой фазы по умолчанию и исключить все **/unit/**
из фазы интеграции.
Ответы
Ответ 1
Извините, нет никакого способа сделать это, ИМХО даже с некоторыми взломами в виду. Концепция заключается в том, что существует только один целевой каталог для скомпилированных классов и один для скомпилированных тестовых классов (даже схема тегов <build>
раскрывает это). Честно говоря, я действительно не думаю, что это возможно с Maven. Maven способствует прямому, чистому и четкому дизайну вашего приложения, используя хорошо продуманные модули.
Если вы думаете, что вы действительно хотите сделать, это создать модуль интеграционных тестов. Это обычная практика. До сих пор у меня всегда был отдельный модуль тестирования интеграции, и у меня никогда не было проблем с этим. Конечно, вы должны зависеть от всех необходимых модулей для выполнения этих тестов. Вы даже можете зависеть от других классов тестирования модулей, используя <type>test-jar</type>
с вашим выражением о зависимости, как указано здесь:
http://maven.apache.org/guides/mini/guide-attached-tests.html
Мне не нравится этот метод, однако он обычно предпочитает иметь отдельный модуль с поддержкой тестирования, например базовые классы для тестовых примеров JUnit и т.д.
Ответ 2
Основываясь на том, что вы написали, это звучит так, будто вы не назвали ваши тесты интеграции правильно, и вы не использовали maven-failsafe-plugin для своих тестов интеграции. На основе соглашения maven-failsafe-plugin вы должны назвать свои интеграционные тесты, например *IT.java
. Если вы соответствующим образом назвали свои тесты интеграции, вы можете справиться с этим с более или менее конфигурацией, подобной этой:
<project ...>
[...]
<build>
[...]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>add-test-source</id>
<phase>generate-test-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/integration/java</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
[...]
</build>
[...]
</project>
С вышесказанным можно провести тесты интеграции в одном модуле. Но это не решит идею скомпилировать классы скомпилированных интеграционных тестов в отдельную папку.
Иногда лучше иметь отдельный тестовый модуль интеграции, который содержит только те тесты интеграции (что приводит к созданию многомодульной сборки).
Если вам нравится оставлять соглашения Maven, вы можете попытаться настроить плагин maven-compiler для использования другого выходного пути (например, target/integration-tests/classes
), который, по-видимому, не будет работать.
Ответ 3
Если вы хотите изменить исходную папку unit test (а не добавить дополнительный), просто измените элемент testSourceDirectory
:
<build>
<testSourceDirectory>${project.basedir}/src/test/groovy</testSourceDirectory>
Это полезно, если все ваши модульные тесты написаны в groovy. (Но вам также нужно будет настроить maven для компиляции вашего кода groovy - см. groovy-eclipse-maven-plugin или build-helper-maven-plugin.)