Как исключить модуль из сборки реактора Maven?
у нас есть проект Maven 2 с большим количеством модулей в нем. Пример:
<modules>
<module>common</module>
<module>foo</module>
<module>data</module>
<module>bar</module>
... more ...
</module>
предположим, что модуль "данные" занимает много времени для сборки, и мы хотим исключить его, когда проект строится сервером CI. В настоящее время мы используем два пом.xml-файлы для достижения этой цели. Один имеет все модули в нем, а другой имеет все модули, кроме тех, которые могут быть оставлены для CI. Но это очень раздражает, потому что иногда мы забываем поставить новый модуль в и файлы.
есть ли решение, которое не требует двух отдельных списков модулей?
6 ответов:
самый простой может быть использование
profiles
такой:<project> ... <modules> <module>common</module> <module>foo</module> <module>bar</module> <modules> ... <profiles> <profile> <id>expensive-modules-to-build</id> <modules> <module>data</module> </modules> </profile> </profiles> </project>
затем вы должны проверить способы активации профилей
С Maven 3.2.1, теперь вы можете использовать
-pl !<module_name>,!<module_name>
чтобы исключить некоторые модули из сборки реактора.смотрите этот запрос функции:https://jira.codehaus.org/browse/MNG-5230
проекты для сборки также могут быть указаны в командной строке mvn. Это устранит необходимость в отдельном pom, но вместо этого вам придется менять конфигурацию CI каждый раз, когда появляется новый модуль.
-pl,--projects <arg> Comma-delimited list of specified reactor projects to build instead of all projects. A project can be specified by [groupId]:artifactId or by its relative path.
возможно сочетание этого флага и
--also-make-dependents
или--also-make
снова уменьшить эту нагрузку.-am,--also-make If project list is specified, also build projects required by the list -amd,--also-make-dependents If project list is specified, also build projects that depend on projects on the list
Я предполагаю, что вы хотите, чтобы сборка по умолчанию всегда создавала все, независимо от скорости, чтобы новые разработчики могли быстро начать работу, не понимая много о POM. Вы можете использовать такие профили:
<modules> <module>common</module> <module>foo</module> <module>bar</module> </modules> ... <profiles> <profile> <id>expensive-modules-to-build</id> <activation> <activeByDefault>true</activeByDefault> </activation> <modules> <module>data</module> </modules> </profile> </profiles> </project>
проблема в том, что если разработчик задает другой профиль в командной строке, то
expensive-modules-to-build
не входит (если разработчик также не указывает его). Это усложняет запоминание того, какие профили должны быть включенный.вот хакерский способ обойти это. Оба профиля всегда включены, потому что pom.XML-файл всегда существует. Поэтому, чтобы исключить дорогие модули, вы можете использовать
-P!full-build
в командной строке.<profiles> <profile> <id>full-build</id> <activation> <file> <exists>pom.xml</exists> </file> </activation> <modules> <module>data</module> </modules> </profile> <profile> <id>short-build</id> <activation> <file> <exists>pom.xml</exists> </file> </activation> <modules> <module>common</module> <module>foo</module> <module>bar</module> </modules> </profile> </profiles>
еще одна идея: модули реактора могут быть вложенными, поэтому должно быть возможно группировать ваши быстрые и медленные модули сборки в отдельные POM, а затем добавить еще один агрегатор pom, содержащий эти два модуля. Затем ваш сервер CI может ссылаться только на pom, содержащий модули быстрого построения.
<artifactId>fast</artifactId> <modules> <module>fast-a</module> <module>fast-b</module> <module>fast-c</module> </module> <artifactId>all</artifactId> <modules> <module>fast</module> <module>slow</module> </module>
вы могли бы использовать maven профили. В нашей среде сборки, мы создали профиль
quick
это отключает многие плагины и выполнение тестов.Это делается
<profile> <id>quick</id> <properties> <skipTests>true</skipTests> <!-- others... --> </properties> <build> <plugins> <!-- configuration... --> </plugins> </build> </profile>
и затем мы вызываем maven следующим образом
mvn groupId:artifactId:goal -P quick
вы можете отключить компиляцию и другие стандартные плагины в pom вашего модуля, чтобы ускорить его.