Активировать разные профили Maven в зависимости от текущего модуля? - PullRequest
2 голосов
/ 19 июня 2009

У нас есть многомодульная сборка с модулями, использующими различные технологии, такие как Java и Flex. Можно ли как-то активировать разные профили на основе модуля, который скомпилирован в настоящее время?

Я пробовал с активацией как

<profile>
  <id>flex</id>
  <activation>
    <file>
      <exists>${basedir}/src/main/flex</exists>
    </file>
  </activation>
  ...
</profile

Но это не сработало, хотя использование $ {basedir} задокументировано в документации Maven (это ошибка в Maven). Есть ли другая возможность иметь разные активации в зависимости от текущего модуля? Или Maven позволяет активировать профиль только для всех модулей или нет вообще?

Ответы [ 6 ]

5 голосов
/ 23 июня 2009

После еще одного исследования я наконец пришел к выводу, что это невозможно по двум причинам в текущей версии Maven (2.1.0):

  • Профили Maven не наследуются, поэтому вы не можете определить профиль в родительском POM и активировать его в дочернем POM.
  • Я не нашел возможности активировать профиль из самого POM. Активация не работает с $ {basedir} и ответом активации свойства являются только системные параметры, которые глобально задаются с помощью опции -D.
2 голосов
/ 01 августа 2012

Для таких, как я, читающих этот вопрос в поисках ответов, этот вариант использования теперь работает в Maven 3.

Произошла ошибка, влияющая на эту функцию в ранних версиях 3 (см. http://jira.codehaus.org/browse/MNG-2363), но она корректно работает при использовании Maven 3.0.4.

2 голосов
/ 16 марта 2010

В 2.2.1 профили наследуются, но проблема $ {basedir} остается. Я нахожусь в одной лодке - мне нужно активировать профиль, основанный на существовании файла в данном проекте. Мои дочерние сборки работают по отдельности просто отлично (унаследованный профиль активируется локальным существующим файлом), но если я запускаю сборку от верхнего родителя, они завершаются неудачно, поскольку файл не найден.

0 голосов
/ 12 мая 2014

Не знаю, поможет ли это, но я решил похожую проблему следующим способом:

  1. Я создал и описал профиль в родительском POM, который имеет activeByDefault=false. Затем PluginManagement-Section содержит конфигурации для различных плагинов.
  2. Дети могут повторно использовать этот профиль и установить activeByDefault=true Это делает профиль активным, но ни один из плагинов не активирован.
  3. Но, к счастью, описанные конфигурации плагинов доступны. Вы можете повторно использовать их в детях, определив их в разделе плагинов. Вы просто предоставляете group- и artifactID и устанавливаете inherited=true для каждого плагина, который хотите использовать в дочерних элементах.

Надеюсь, это поможет. Извините за то, что не включил фрагменты кода, но я надеюсь, что все это понятно.

0 голосов
/ 10 августа 2009

Что касается активации на основе файлов, вы можете попробовать удалить $ {basedir}. Мы используем это так:

<activation>
   <file>
      <missing>target/jboss/conf/jboss-service.xml</missing>
   </file>
</activation>
0 голосов
/ 19 июня 2009

Вы можете установить свойство в каждом модуле, для которого вы хотите использовать профиль, а затем использовать активацию «свойства» в своих профилях.

...