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, а не в командной строке?


person dds    schedule 06.05.2014    source источник


Ответы (1)


Увы, невозможно сделать то, что вы пытаетесь сделать. Я часами пытался сделать то же самое, прежде чем нашел эту заметку на веб-сайте Codehaus. :

Обратите внимание, что только свойства, установленные в командной строке Maven, могут активировать профили. Свойства, установленные в POM, родительском POM или других профилях, не действуют.

По сути, активация профиля происходит очень рано при обработке POM, до того, как будут интерполированы все свойства. По сути, это означает, что свойство, активирующее профиль, должно иметь определенное значение в самом начале сборки — как системное свойство, то есть в командной строке — потому что активация профиля происходит до того, как Maven обработает какие-либо <properties> элементы. Существует ответ на аналогичный вопрос StackOverflow, который содержит более подробную информацию и справочную документацию.

person user944849    schedule 06.05.2014