Как исключить модуль из сборки реактора Maven?
У нас есть проект Maven 2 с большим количеством модулей. Пример:
<modules>
<module>common</module>
<module>foo</module>
<module>data</module>
<module>bar</module>
... more ...
</module>
Скажем, модуль "data" требует много времени для сборки, и мы хотим исключить его, когда проект будет построен сервером CI. В настоящее время для этого мы используем два файла pom.xml. В нем есть все модули, а в другом - все модули, кроме тех, которые могут быть исключены для CI. Но это довольно раздражает, потому что иногда мы забываем поместить новый модуль в оба файла.
Есть ли решение, которое не нуждается в двух отдельных списках модулей?
Ответы
Ответ 1
Самый простой способ - использовать 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>
Затем вы можете проверить способы активации профилей
Ответ 2
С Maven 3.2.1 теперь вы можете использовать -pl !<module_name>,!<module_name>
для исключения определенных модулей из сборки реактора.
Смотрите этот запрос функции: https://jira.codehaus.org/browse/MNG-5230
Ответ 3
Проекты для сборки также могут быть указаны в командной строке 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
Ответ 4
Я предполагаю, что вы хотите, чтобы сборка по умолчанию всегда создавала все, независимо от скорости, чтобы новые разработчики могли быстро начать работу, не понимая много о 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>
Ответ 5
Еще одна идея: модули реактора могут быть вложенными, поэтому можно объединить свои быстрые и медленные модули в отдельные поры, а затем добавить еще один агрегатор, содержащий эти два модуля. Ваш 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>
Ответ 6
Вы можете использовать maven profiles. В нашей среде сборки мы создали профиль quick
, который отключает многие плагины и выполняет тестирование.
Это выполняется
<profile>
<id>quick</id>
<properties>
<skipTests>true</skipTests>
<!-- others... -->
</properties>
<build>
<plugins>
<!-- configuration... -->
</plugins>
</build>
</profile>
И затем мы вызываем maven следующим образом
mvn groupId:artifactId:goal -P quick
Возможно, вы можете отключить компиляцию и другие стандартные плагины в папке вашего модуля, чтобы ускорить ее.