Почему я не могу активировать профиль Maven2 из другого профиля?
У меня есть многомодульный проект Maven2, который создает веб-приложение. Приложение подключено к серверу и БД. В нашей среде развернуто несколько экземпляров серверов, а также есть несколько бэкэнд и экземпляров БД для разработки, UAT, производство и т.д. Таким образом, каждая конфигурация приложения нуждается в этих трех координатах:
- сервер front-end
- сервер
- БД
Я работаю над унификацией и автоматизацией конфигурации приложения. Легко и очевидно представить эти различные конфигурации в виде профилей в Maven. Затем я могу создать определенную конфигурацию, активировав один профиль из каждой группы, например.
mvn -Pserver.Server1,backend.prod,db.uat clean install
Это немного утомительно для типа и подверженности ошибкам - если конкретный сервер неправильно сконфигурирован для подключения к неправильной БД, цена может быть высокой. Одним из очевидных способов исправить это было бы включение всех полезных комбинаций профилей в файлы script.
Но я думал, что я могу быть более умным, чем активировать необходимый профиль back-end и DB непосредственно из профиля сервера. Профили сервера находятся в главной папке, например.
<profile>
<id>server.myserver</id>
<properties>
<jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home>
<server.name>NightlyBuild</server.name>
<hosttobind>192.168.1.100</hosttobind>
<servlet.port>8080</servlet.port>
...
<db>dev02</db>
</properties>
</profile>
И бэкэнд и профили БД находятся в pom подмодуля Config, например.
<profile>
<id>db.dev02</id>
<activation>
<property>
<name>db</name>
<value>dev02</value>
</property>
</activation>
<properties>
<jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address>
</properties>
</profile>
Итак, теоретически, поскольку профиль server.myserver
устанавливает свойство db
в dev02
, это должно инициировать активацию профиля db.dev02
в дочернем помпе. Однако этого не происходит. (И если два профиля находятся в одном и том же pom, btw). Если я установил свойство из командной строки с помощью
mvn -Ddb=dev02 help:active-profiles
тогда профиль активируется, хотя, видимо, я ничего не написал.
Я что-то пропустил? Есть ли другой способ сделать эту работу?
Я вижу, что существует аналогичный вопрос: Могу ли я сделать один профиль maven активировать другой?
Однако ИМХО это не дубликат - я вижу, что мой подход не работает, и я хотел бы понять, почему. (Я прочитал ссылку, но я мог бы пропустить что-то очевидное).
Ответы
Ответ 1
Функция просто не существует. Активатор свойств использует входящие свойства, а не что-либо, заданное профилями (поскольку иначе он не знал бы, какой порядок активировать их без какой-либо более сложной логики).
Решение, которое вы использовали, имеет одинаковые свойства для активации того, что вы хотите делать вместе, является лучшим решением. Я понимаю, что это может быть не всегда удовлетворительным - в этом случае все, что вы можете сделать, это вернуться к тому, чтобы сделать индивидуальные профили максимально простыми, чтобы вы могли комбинировать их так, как вы хотите, в командной строке, не дублируя друг друга.
Проблема с этой функцией: https://issues.apache.org/jira/browse/MNG-3309
Проблема, связанная с активацией актива: https://issues.apache.org/jira/browse/MNG-2276
Ответ 2
Проблема MNG-2276, упомянутая Бреттом, была разрешена в maven 3.x, поэтому теперь вы можете определять свойства в settings.xml для триггерные профили в вашем помпе. Вот пример:
В settings.xml:
<profile>
<id>localDist</id>
<activation>
<property><name>localDist</name></property>
</activation>
<properties>
<doReleaseTasks>true</doReleaseTasks>
</properties>
</profile>
В вашей pom (или еще лучше, в вашем родительском pom):
<profile>
<id>doReleaseTasks</id>
<activation>
<property><name>doReleaseTasks</name></property>
</activation>
<build>
<plugins>
... mvn -DlocalDist will activate these plugins
</plugins>
</build>
</profile>
Хорошая идея использовать плагин forcecer, чтобы заставить mvn 3.0 или больше:
<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-maven</id>
<goals> <goal>enforce</goal> </goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0,)</version>
<message>
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276)
</message>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>