Пропустить подмодуль во время сборки Maven
Нам нужно иметь возможность пропускать подмодуль в определенных средах.
Данный модуль содержит тесты интеграции и занимает полчаса. Поэтому мы хотим включить его при создании на CI-сервере, но когда разработчики строят локально (и тесты запускаются), мы хотим пропустить этот модуль.
Есть ли способ сделать это с настройкой профиля? Я сделал несколько поисковых запросов и посмотрел на другие вопросы/ответы здесь и не нашел хорошего решения.
Я предполагаю, что один из вариантов - полностью удалить этот субмодуль из родительского pom.xml
и просто добавить еще один проект на нашем сервере CI, чтобы просто создать этот модуль.
Предложения?
Ответы
Ответ 1
Конечно, это можно сделать с помощью профилей. Вы можете сделать что-то вроде следующего в родительском pom.xml.
...
<modules>
<module>module1</module>
<module>module2</module>
...
</modules>
...
<profiles>
<profile>
<id>ci</id>
<modules>
<module>module1</module>
<module>module2</module>
...
<module>module-integration-test</module>
</modules>
</profile>
</profiles>
...
В вашем CI вы будете запускать maven с профилем ci
, т.е. mvn -P ci clean install
Ответ 2
Версия Maven 3.2.1 добавила эту функцию, вы можете использовать ключ -pl с помощью "!" для исключения определенных подмодулей.
mvn -pl '!submodule-to-exclude' install
Будьте осторожны в bash персонаже! является специальным символом, поэтому вам либо нужно сделать одиночную цитату (например, я), либо избежать ее с помощью символа обратной косой черты.
Синтаксис для исключения нескольких модулей такой же, как включение
mvn -pl '!submodule1,!submodule2' install
EDIT Windows не похоже на одиночные кавычки, но это необходимо в bash; в Windows используйте двойные кавычки (спасибо @awilkinson)
mvn -pl "!submodule1,!submodule2" install
Ответ 3
Можно решить, какие проекты реакторов нужно построить, указав аргумент командной строки -pl
:
$ mvn --help
[...]
-pl,--projects <arg> Build specified reactor projects
instead of all projects
[...]
Он принимает список параметров, разделенных запятыми, в одной из следующих форм:
- относительный путь к папке, содержащей POM
-
[groupId]:artifactId
Таким образом, учитывая следующую структуру:
project-root [com.mycorp:parent]
|
+ --- server [com.mycorp:server]
| |
| + --- orm [com.mycorp.server:orm]
|
+ --- client [com.mycorp:client]
Вы можете указать следующую командную строку:
mvn -pl .,server,:client,com.mycorp.server:orm clean install
построить все. Удалите элементы в списке, чтобы создать только те модули, которые вам нравятся.
EDIT: как blackbuild указал, что с Maven 3.2.1 у вас есть новый флаг -el
, который исключает проекты из реактора, аналогично тому, что -pl
делает:
Ответ 4
Понятие мультимодульных проектов предназначено для удовлетворения потребностей созависимых сегментов проекта. Такой клиент зависит от услуг, которые, в свою очередь, зависят от программ EJB или доступа к данным. Таким образом вы можете группировать тесты непрерывной интеграции (CI). Я бы рационализировал это, сказав, что тесты CI должны быть заблокированы с изменениями логики приложения.
Предположим, что ваш проект структурирован как:
project-root
|
+ --- ci
|
+ --- client
|
+ --- server
project-root/pom.xml
определяет модули
<modules>
<module>ci</module>
<module>client</module>
<module>server</module>
</modules>
ci/pom.xml
определяет такие профили, как:
...
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</profile>
<profile>
<id>CI</id>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</profile>
</profiles>
Это приведет к прохождению тестов Maven в этом модуле, за исключением случаев, когда активен профиль с именем CI
.
Ваш сервер CI должен быть проинструктирован выполнить mvn clean package -P CI
. Веб-сайт Maven имеет подробное объяснение механизма профилирования.
Ответ 5
теперь (из версии 1.1.1) флаг "пропустить" в яме.
Итак, вы можете делать такие вещи, как:
<profile>
<id>pit</id>
<build>
<plugins>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
в вашем модуле, и яма пропустит
[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @module-selenium ---
[INFO] Пропуск проекта