У меня есть многомодульный проект maven, который успешно строится, я хотел бы собрать только один из имеющихся у меня модулей. Как мне это сделать с профилями? Я мог бы сделать это из консоли двумя способами, один из которых - перейти к дочернему модулю и mvn package, или я мог бы использовать реактор для сборки только одного модуля.
Могу ли я сделать то же самое с профилями? Путем изменения POM? Спасибо
ИЗМЕНИТЬ
Если это невозможно из POM, могу ли я сделать это из settings.xml?
Ответ 1 · рейтинг 14 · Pascal Thivent
Чтобы реализовать это с помощью профилей, вы можете использовать два профиля: один <activeByDefault> со всеми модулями, а другой - только с нужным модулем. Что-то вроде этого:
<profiles>
<profile>
<id>all</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>module-1</module>
...
<module>module-n</module>
</modules>
</profile>
<profile>
<id>module-2</id>
<modules>
<module>module-2</module>
</modules>
</profile>
<profiles>
И затем назовите это так:
mvn -Pmodule-2 package
Здесь следует отметить две вещи:
- Вам нужно переместить
<modules> из POM в профиль "по умолчанию" (поскольку <modules> из профиля являются только аддитивными, они не скрывают модули, объявленные в POM).
- Пометив его как
<activeByDefault>, профиль "по умолчанию" будет выбран, если больше ничего не активно, но деактивирован, если что-то еще есть.
Можно даже параметризовать имя модуля и передать его как свойство:
<profiles>
...
<profile>
<id>module-x</id>
<activation>
<property>
<name>module-name</name>
</property>
</activation>
<modules>
<module>${module-name}</module>
</modules>
</profile>
<profiles>
И вызовите maven следующим образом:
mvn -Dmodule-name=module-2 package
Но это ИМХО плохая реализация, я предпочитаю -pl "продвинутые" варианты реактора (меньше xml, гораздо больше мощности и гибкости):
mvn -pl module-2 package
Ответ 2 · morsik
Чтобы преодолеть характер аддитивности maven по умолчанию <modules>, работающий с <profiles>, вы можете использовать реактор с определенным профилем, например:
mvn -pl module-2 -Pprofile-name package
Это упакует модуль-2, определенный в имени профиля, а не в профиле по умолчанию.