Активация профиля maven на основе нескольких свойств
Я создаю сборку maven 2 для проекта, и я придумал профили, так как сборка должна быть создана для разных мест (например, Берлин, Париж, Северный полюс) и другой среды (разработка, производство). Они указаны через свойства. Так что для "Северного полюса" "DEV" я делаю:
-Dlocation=NorthPole -Denvironment=DEV
Теперь я хотел бы активировать мой файл porfile на основе обоих этих свойств, а не только одного. Поэтому я попробовал следующее:
<profiles>
<profile>
<id>NOrth Pole DEV</id>
<activation>
<property>
<name>location</name>
<value>NorthPole</value>
</property>
<property>
<name>environment</name>
<value>DEV</value>
</property>
</activation>
... <!-- Set some North Pole DEV specific stuff -->
</profile>
</profiles>
Это не работает, maven ожидает увидеть не более одного элемента <property>
.
Обратите внимание, что у меня есть другое свойство для свойств, поэтому сделать его единственным свойством locationEnv
значения NorthPole-DEV
не является тем, что я хочу иметь.
Итак, есть ли способ или обходной путь или что-то еще, как активировать профиль на основе комбинации свойств?
Ответы
Ответ 1
почему бы не использовать профиль напрямую:
<profiles>
<profile>
<id>north-pole</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
....
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
....
</profile>
</profiles>
Теперь вы можете активировать профили по командной строке.
mvn -Pdev,north-pole ...
Ответ 2
Я боюсь, что нет хорошего решения вашей проблемы (если нет новых функций Maven, о которых я не знаю).
В теории вы можете ввести производное свойство, значение которого объединено из двух перечисленных вами свойств. Однако проблема заключается в том, что профили оцениваются до свойств, определенных в pom, поэтому такое производное свойство не может использоваться для активации профиля: - (
Лучшим обходным решением, которое я мог бы подумать о подобной проблеме, было то, чтобы активировать профиль явно, и поместить различные комбинации параметров командной строки в отдельные файлы пакета / script, чтобы сделать выполнение проще и избежать проблем с ошибкой.
Ответ 3
Возможное решение
Попробуйте это расширение: https://github.com/kpiwko/el-profile-activator-extension
Это позволяет иметь такой синтаксис:
<profile>
<id>NOrth Pole DEV</id>
<activation>
<property>
<!-- mvel property name is obligatory -->
<name>mvel</name>
<value>isdef location && location=="NorthPole" &&
isdef environment && environment=="DEV"</value>
</property>
</activation>
</profile>
Я сам не пробовал, но, похоже, хороший проект.
Как избежать ручной настройки Maven
Вам нужно поместить необходимые две банки проекта в $MAVEN_HOME/lib/ext. Однако вы можете автоматизировать их настройку. Вот так:
- Вы можете добавить профиль активированный по отсутствию файла $MAVEN_HOME/lib/ext/el-profile-activator-extension.jar
- Этот профиль может загружать банки из maven с помощью зависимого плагина в папку $MAVEN_HOME/lib/ext в фазе init
- Затем вы можете написать сообщение, что сборка сконфигурировала папку maven, и следующая сборка будет успешной.
Протестированный профиль:
<profile>
<id>prepare-maven-extended-libs</id>
<activation>
<file>
<missing>${maven.home}/lib/ext/el-profile-activator-extension.jar</missing>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy</id>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.redhat.jboss.maven</groupId>
<artifactId>el-profile-activator-extension</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${maven.home}/lib/ext</outputDirectory>
<destFileName>el-profile-activator-extension.jar</destFileName>
</artifactItem>
<artifactItem>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.1.3.Final</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${maven.home}/lib/ext</outputDirectory>
<destFileName>mvel2.jar</destFileName>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/wars</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>validate</phase>
<goals><goal>execute</goal></goals>
</execution>
</executions>
<configuration>
<source>
fail("For profile activation we use an extension jar. It is now in your ${maven.home}/lib/ext folder. Please restart the build, and then it will be successful.")
</source>
</configuration>
</plugin>
</plugins>
</build>
</profile>
Ответ 4
Ответ на khmarbaise кажется мне более изящным.
К комментарию Jan вы можете обратиться к файлу, добавив правильные
например с профилем dev, активирован North Pole, вы можете обратиться к NorthPole-dev.xml с
$ {Место} -. ${Окр}.xml
Мне пришлось опубликовать другой ответ, поскольку я не могу добавлять комментарии к другим ответам.: (
Ответ 5
Я считаю, что вы можете сделать что-то вроде этого
<properties>
<env>dev</env>
<location>North Pole</location>
</properties>
<profiles>
<!-- dev North Profile -->
<profile>
<id>dev North Pole</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- qa North Profile -->
<profile>
<id>qa North Pole</id>
<properties>
<env>qa</env>
<location>North Pole</location>
</properties>
</profile>
</profiles>
<build>
do profile specific stuff here
</build>
Чтобы создать профиль, который вы можете добавить в команде '-P = dev North Pole'