Чтобы расширить ответ @ rich-seller и самоответ @ Bostone, кажется невозможным создать установку, в которой родительский POM определяет несколько профилей в качестве альтернативы, а дочерние POM выбирают один из этих профилей по умолчанию, позволяя вам временно отменить выбор для ребенка (т. е. в CLI). Рассмотрим родительский POM для проектов, которые используют некоторую платформу и связанный плагин, обе версии которых, как мы можем предположить, определяются свойствами:
<profiles>
<profile>
<id>newest</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<framework.version>2.0</framework.version>
<plugin.version>2.0</plugin.version>
</properties>
</profile>
<profile>
<id>older</id>
<activation>
<property>
<name>older.framework</name>
<value>true</value>
</property>
</activation>
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
</profile>
</profiles>
Теперь дочерний объект, наследующий от этого родительского POM по умолчанию, будет использовать 2.0, как вы ожидаете, и -Polder
или -Dolder.framework=true
будут работать, чтобы попытаться построить его с более старой платформой (например, для проверки совместимости). Однако вы не можете написать в POM ребенка
<properties>
<older.framework>true</older.framework>
</properties>
и профиль older
будет активирован автоматически. Вы можете использовать файловую активацию, чтобы создать этот модуль для версии 1.1, если newest
не был активен по умолчанию, но тогда не легко временно запустить его для версии 2.0: насколько я знаю, older
и newest
профили будут активны, если вы передадите -Pnewest
, поэтому вам нужно явно отключить другие профили, что нецелесообразно, если у вас есть дюжина из них. Так что решения просто нет, кроме как скопировать информацию профиля в дочерний POM:
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
в этот момент -Pnewest
будет не работать, чтобы переопределить эти свойства, поэтому вам нужно использовать -Dframework.version=2.0 -Dplugin.version=2.0
.
Другими словами, профили полезны, только если все дочерние модули могут использовать один и тот же профиль (здесь newest
) по умолчанию. Если некоторые из них обычно построены с 1.1, а некоторые с 2.0, профили бесполезны.
Похоже, это вариант использования для улучшения ядра Maven или, возможно, расширения для сборки Maven 3. http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators и https://github.com/maoo/maven-tiles приходят на ум.