Ответ 1
Чтобы расширить ответ на @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>
Теперь дочерний объект, унаследованный от этого родительского ПОМ по умолчанию, будет использовать 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 приходят на ум.