Активация профиля maven на основе нескольких свойств - PullRequest
25 голосов
/ 24 марта 2011

Я создаю сборку 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 не то, что я хочу иметь.

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

Ответы [ 6 ]

13 голосов
/ 24 марта 2011

Боюсь, что нет хорошего решения вашей проблемы (если нет новых возможностей Maven, о которых я не знаю).

Теоретически вы можете ввести производное свойство, значение которого объединено из двух перечисленных вами свойств. Однако проблема в том, что профили оцениваются до свойств, определенных в pom, поэтому такое производное свойство нельзя использовать для активации профиля: - (

Лучший обходной путь, который я мог придумать для аналогичной проблемы, состоял в том, чтобы явно активировать профиль и поместить различные комбинации параметров командной строки в отдельные файлы пакета / сценария, чтобы упростить выполнение и избежать ошибок при опечатках.

10 голосов
/ 24 марта 2011

почему бы не использовать профиль, например:

<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 ...
4 голосов
/ 29 августа 2013

Возможное решение

Попробуйте это расширение: 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
  • Этот профиль может загружать jar-файлы из maven с помощью подключаемого модуля зависимости в папку $ MAVEN_HOME / lib / ext на этапе инициализации
  • Затем вы можете записать сообщение, что сборка настроилапапка 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>
1 голос
/ 24 марта 2011

Ответ Хмарбайса кажется мне более элегантным.К комментарию Яна вы можете обратиться к файлу, добавив соответствующие свойства, например, с профилем dev, активированным Северным полюсом, вы можете сослаться на NorthPole-dev.xml с $ {location} - $ {env} .xml.

Мне пришлось опубликовать еще один ответ, так как я не могу добавлять комментарии к другим ответам.(

0 голосов
/ 01 мая 2018

После исчерпывающего расследования я опубликовал видео, где объясняю использование профилей Maven для среды с Spring Boot.Это весенний загрузочный проект отдыха, который обрабатывает свойства приложения для каждой среды с помощью профилей Maven.

Вот ссылки:

Youtube: https://youtu.be/UbDpvh3YvDw

Github: https://github.com/carlosCharz/mavenprofilespringboot

Фрагмент кода:

Параметры приложения

custom.server_url = @ custom.server_url @

custom.server_port = @ custom.server_port @

custom.debuggable = @ custom.debuggable @

custom.image_quality = HIGH

Переопределяет параметры

custom.server_url = api-dev.yourserver.com

custom.server_port = 80

custom.debuggable = true

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.wedevol</groupId>
<artifactId>mvnspringboot</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>Spring Boot Project with Maven</name>
<description>This is a spring boot rest project that handle the application properties per environment using Maven profiles.</description>

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <!-- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes -->
</parent>

<dependencies>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

<!-- Maven profile per environment -->
<profiles>
    <profile>
        <id>local</id>
        <activation>
           <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <overrides.props.file>local.overrides.properties</overrides.props.file>
            <current.profile>local</current.profile>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <properties>
            <overrides.props.file>dev.overrides.properties</overrides.props.file>
            <current.profile>dev</current.profile>
        </properties>
    </profile>
    <profile>
        <id>qa</id>
        <properties>
            <overrides.props.file>qa.overrides.properties</overrides.props.file>
            <current.profile>qa</current.profile>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <overrides.props.file>prod.overrides.properties</overrides.props.file>
            <current.profile>prod</current.profile>
        </properties>
    </profile>
</profiles>

<build>
    <finalName>mvnspringboot</finalName>
    <!-- Maven Resources. It handles the copying of project resources to the output directory. -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>profiles/*</exclude>
            </excludes>
        </resource>
    </resources>
    <!-- Maven filtering. The variables are included in the resources ( ${..} or @...@ delimiters) -->
    <filters>
        <filter>src/main/resources/profiles/${overrides.props.file}</filter>
    </filters>
    <plugins>
        <!-- Spring boot maven plugin -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- Ant plugin to print the current maven profile -->
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <echo>Current maven active profile: ${current.profile}</echo>
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Дайте мне знать, если это сработало!Gretings!

0 голосов
/ 24 марта 2011

Я верю, что вы можете сделать что-то вроде этого

<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'

...