Maven: свойство активировать профиль в подмодулях
У нас есть многомодульный проект maven, и на нем работают разные платформы, такие как JBoss 4 и JBoss 7. Мы указываем platform
свойство, а затем использовать его в качестве классификатора для артефактов и для активации специфичного для платформы профиля в подмодулях, например:
<activation>
<property>
<name>platform</name>
<value>jboss71x</value>
</property>
</activation>
в этих профилях мы, среди прочего, указываем версии предоставленных зависимостей. Например, мы делаем импорт родительского pom jboss:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-parent</artifactId>
<version>${dependencies.jbossas7.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Поэтому, когда мы указываем свойство в качестве аргумента командной строки (-Dplatform=jboss71x
), все работает хорошо.
Но когда свойство установлено в <properties>
раздел в корне pom.xml (я также пытался установить его в родительском pom), похоже, что версии из родительского pom отсутствуют:
[ERROR] 'dependencies.dependency.version' for commons-lang:commons-lang:jar is missing. @ line 46, column 21
[ERROR] 'dependencies.dependency.version' for commons-beanutils:commons-beanutils:jar is missing. @ line 56, column 21
[ERROR] 'dependencies.dependency.version' for commons-collections:commons-collections:jar is missing. @ line 61, column 21
Последняя версия Maven: 3.2.1.
Почему это происходит, и как мы можем указать это значение свойства в pom.xml, а не в командной строке?
1 ответ
Увы, невозможно сделать то, что вы пытаетесь сделать. Я потратил часы, пытаясь сделать то же самое, прежде чем найти эту заметку на сайте Codehaus:
Обратите внимание, что только свойства, заданные в командной строке Maven, могут активировать профили. Свойства, установленные в POM, родительском POM или других профилях, не действуют.
По сути, активация профиля происходит очень рано при обработке POM, до того, как все свойства будут интерполированы. По сути это означает, что свойство, активирующее профиль, должно иметь определенное значение в самом начале сборки - как системное свойство, так и в командной строке, - потому что активация профиля происходит до того, как Maven обработает любой <properties>
элементы. Существует ответ на аналогичный вопрос Stackru, который дает более подробную информацию и справочные документы.