Пропустить подмодуль во время сборки Maven
-
25-10-2019 - |
Вопрос
Нам необходимо иметь возможность пропускать подмодуль в определенных средах.
Рассматриваемый модуль содержит интеграционные тесты и его запуск занимает полчаса.Поэтому мы хотим включить его при сборке на CI-сервере, но когда разработчики собирают локально (и запускаются тесты), мы хотим пропустить этот модуль.
Есть ли способ сделать это с помощью настроек профиля?Я немного погуглил, просмотрел другие вопросы/ответы здесь и не нашел хорошего решения.
Я полагаю, что один из вариантов — удалить этот подмодуль из родительского. pom.xml
полностью и просто добавьте еще один проект на наш CI-сервер, чтобы просто построить этот модуль.
Предложения?
Решение
Конечно, это можно сделать с помощью профилей. Вы можете сделать что -то вроде следующего в своем родительском 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
Другие советы
В Maven версии 3.2.1 добавлена эта функция, вы можете использовать -pl
выключатель (ярлык для --projects
список) с !
или -
(источник), чтобы исключить определенные подмодули.
mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install
Будьте осторожны при bash персонажа!— это специальный символ, поэтому вам придется либо заключить его в одинарные кавычки (как я), либо экранировать его символом обратной косой черты.
Синтаксис исключения нескольких модулей такой же, как и для включения.
mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install
РЕДАКТИРОВАТЬ Windows, похоже, не любит одинарные кавычки, но в bash они необходимы;в Windows используйте двойные кавычки (спасибо @awilkinson)
mvn -pl "!submodule1,!submodule2" install
Можно решить, какие реакторные проекты создать, указав -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
Чтобы все построить. Удалите элементы в списке, чтобы создать только те модули, которые вам нужно.
РЕДАКТИРОВАТЬ: как Черная салдинка указал, что по состоянию на Maven 3.2.1 у вас есть новый -el
флаг Это исключает проекты из реактора, аналогично тому, что -pl
делает:
Понятие мультимодульных проектов предназначено для удовлетворения потребностей в коде, независимых сегментов проекта. Такой клиент зависит от услуг, которые, в свою очередь, зависит от EJBS или подпрограмм ACCESS. Ты мог Сгруппируйте ваши тесты непрерывной интеграции (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 есть подробное объяснение механизма профилирования.
В настоящее время есть (из версии 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] --- Пейтест-Мавен: 1.1.3: MutationCoverage (default-cli) @ module-selenium --- [Информация] Проектирование проекта