Activation du profil maven sur la base de propriétés multiples

je suis en train de créer une maquette maven 2 pour un projet et j'ai créé des profils car la maquette doit être créée à la fois pour des sites différents (par exemple Berlin, Paris, Pôle Nord) et pour des environnements différents (développement, Production). Ceux-ci sont spécifiés via les propriétés. Donc, pour "Pôle Nord", les "DEV" je n':

-Dlocation=NorthPole -Denvironment=DEV

maintenant, je voudrais acivate mon fichier porf basé sur ces deux propriétés, pas un seul. Alors j'ai essayé de suivre:

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

This ne fonctionne pas, maven s'attendre à voir au plus un "élément 151920920" là.

s'il vous Plaît noter que j'ai une autre utilisation pour les propriétés ainsi donc, la rendant unique propriété locationEnv de valeur NorthPole-DEV n'est pas ce que je veux.

alors y a-t-il un moyen ou une solution quelconque ou quoi que ce soit d'autre pour activer un profil basé sur une combinaison de propriétés?

23
demandé sur Jan Zyka 2011-03-24 13:00:45

6 réponses

pourquoi ne pas utiliser le profil directement comme:

<profiles>
   <profile>
    <id>north-pole</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    ....
  </profile>
   <profile>
    <id>dev</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    ....
  </profile>
</profiles>

maintenant vous pouvez activer les profils par ligne de commande.

mvn -Pdev,north-pole ...
8
répondu khmarbaise 2011-03-24 11:21:47

je crains qu'il n'y ait pas de bonne solution à votre problème (à moins qu'il n'y ait de nouvelles fonctionnalités Maven dont je ne suis pas au courant).

en théorie, vous pourriez introduire une propriété dérivée dont la valeur est concaténée à partir des deux propriétés que vous avez énumérées. Cependant, le problème est que les profils sont évalués avant les propriétés définies dans le pom, de sorte qu'une telle propriété dérivée ne peut pas être utilisée pour activer un profil: - (

la meilleure solution que je pouvais imaginer pour un un problème similaire était d'activer explicitement le profil, et de mettre les différentes combinaisons de paramètres de ligne de commande dans des fichiers de lots/scripts séparés pour rendre l'exécution plus simple et éviter les problèmes de fautes de frappe.

12
répondu Péter Török 2011-03-24 10:15:12

Solution Possible

essayez cette extension: https://github.com/kpiwko/el-profile-activator-extension

Cela permet d'avoir une telle syntaxe:

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

je n'ai pas essayé moi-même, mais semble être un bon projet.

Comment éviter la configuration manuelle de Maven

vous devez mettre les deux pots nécessaires du projet dans $MAVEN_HOME/lib/ext. Vous peut cependant automatiser leur configuration. Comme ceci:

  • vous pouvez ajouter un profil qui est activé sur absense de $MAVEN_HOME/lib/ext/el-profile-activator-extension.fichier jar
  • ce profil peut télécharger les bocaux de maven en utilisant plugin de dépendance dans le dossier $MAVEN_HOME/lib/ext en phase init
  • , Alors vous pouvez écrire un message, que le construire configuré le dossier maven, et la prochaine construction sera réussie.

profil testé:

<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
répondu Gábor Lipták 2013-08-29 12:48:53

la réponse de khmarbaise me semble plus élégante. Au commentaire de Jan, Vous pouvez vous référer au fichier en ajoutant les properites par exemple, avec profile dev, le pôle Nord activé, vous pouvez vous référer à NorthPole-dev.xml avec ${location} - $ {env}.XML.

j'ai dû poster une autre réponse que je ne suis pas en mesure d'ajouter des commentaires à d'autres réponses. : (

1
répondu Prabhjot 2011-03-24 11:35:18

je crois que vous pouvez faire quelque chose comme cela

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

De couse, pour activer un profil, vous pouvez ajouter dans la commande '-P=dev Pôle Nord'

0
répondu Prabhjot 2011-03-24 10:53:39

après une enquête exhaustive, j'ai posté une vidéo où j'explique l'utilisation de profils Maven par environnement avec botte de printemps. Il s'agit d'un projet de repos de botte de ressort qui gère les propriétés d'application par environnement en utilisant des profils Maven.

Voici les liens:

Youtube: https://youtu.be/UbDpvh3YvDw

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

extrait de Code:

paramètres D'Application

coutume.server_url = @personnalisée.server_url@

coutume.server_port = @personnalisée.server_port@

coutume.debuggable = @personnalisée.debuggable@

coutume.image_quality = HIGH

Remplace les paramètres

coutume.server_url = api-dev.yourserver.com

coutume.server_port = 80

coutume.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>

dites-moi si ça a marché! Gretings!

-2
répondu Carlos Becerra Rodriguez 2018-05-01 22:27:23