Подтвердить что ты не робот

Активация профиля 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 не является тем, что я хочу иметь.

Итак, есть ли способ или обходной путь или что-то еще, как активировать профиль на основе комбинации свойств?

4b9b3361

Ответ 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 &amp;&amp; location=="NorthPole" &amp;&amp; 
                   isdef environment &amp;&amp; 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'