maven 2 - mvn - Activación del perfil de Maven basado en múltiples propiedades.
mvn clean install que es (6)
Estoy creando una compilación de Maven 2 para un proyecto y se me ocurrieron los perfiles ya que la compilación debe crearse para diferentes ubicaciones (por ejemplo, Berlín, París, Polo Norte) y diferentes entornos (Desarrollo, Producción). Los que se especifican a través de propiedades. Así que para el "Polo Norte" "DEV" hago:
-Dlocation=NorthPole -Denvironment=DEV
Ahora me gustaría activar mi archivo basado en estas dos propiedades, no solo en una. Así que traté de seguir:
<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>
Esto no funciona, los expertos pueden ver como máximo un elemento <property>
allí.
Por favor, tenga en cuenta que también tengo otro uso para las propiedades, por lo que no es lo que quiero tener en una sola locationEnv
de valor NorthPole-DEV
.
Entonces, ¿hay alguna forma o solución alternativa o alguna otra forma de activar un perfil basado en una combinación de propiedades?
Solución posible
Pruebe esta extensión: https://github.com/kpiwko/el-profile-activator-extension
Esto permite tener tal sintaxis:
<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>
No lo intenté yo mismo, pero parece ser un buen proyecto.
Cómo evitar la configuración manual de Maven.
Debe colocar los dos archivos del proyecto en $ MAVEN_HOME / lib / ext. Sin embargo, puede automatizar su configuración. Me gusta esto:
- Puede agregar un perfil que se activa en ausencia del archivo $ MAVEN_HOME / lib / ext / el-profile-activator-extension.jar
- Este perfil puede descargar los archivos jar de maven utilizando el complemento de dependencia en la carpeta $ MAVEN_HOME / lib / ext en la fase inicial
- Luego puede escribir un mensaje, que la compilación configuró la carpeta de Maven y que la próxima compilación será exitosa.
Perfil probado:
<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>
¿Por qué no usar el perfil directamente como:
<profiles>
<profile>
<id>north-pole</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
....
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
....
</profile>
</profiles>
Ahora puedes activar los perfiles por línea de comandos.
mvn -Pdev,north-pole ...
Creo que puedes hacer algo como esto
<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>
Por supuesto, para activar un perfil puede agregar el comando ''-P = dev North Pole''
Después de una investigación exhaustiva, publiqué un video donde explico el uso de los perfiles de Maven por entorno con Spring Boot. Este es un proyecto de descanso de arranque de primavera que maneja las propiedades de la aplicación por entorno utilizando perfiles de Maven.
Aquí están los enlaces:
Youtube: https://youtu.be/UbDpvh3YvDw
Github: https://github.com/carlosCharz/mavenprofilespringboot
Fragmento de código:
Parámetros de aplicación
custom.server_url = @ custom.server_url @
custom.server_port = @ custom.server_port @
custom.debuggable = @ custom.debuggable @
custom.image_quality = HIGH
Anula parámetros
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>
Déjame saber si funcionó! ¡Gretings!
La respuesta de Khmarbaise me parece más elegante. Para el comentario de Jan, puede referirse al archivo agregando las propiedades; por ejemplo, con dev de perfil, Polo Norte activado puede referirse a NorthPole-dev.xml con $ {location} - $ {env} .xml.
Tuve que publicar otra respuesta ya que no puedo agregar comentarios a las respuestas de otros. :(
Me temo que no hay una buena solución para su problema (a menos que haya nuevas características de Maven que no conozco).
En teoría, podría introducir una propiedad derivada cuyo valor se concatene de las dos propiedades que enumeró. Sin embargo, el problema es que los perfiles se evalúan antes que las propiedades definidas en el pom, por lo que dicha propiedad derivada no se puede usar para activar un perfil :-(
La mejor solución que se me ocurrió para un problema similar fue activar el perfil explícitamente y colocar las diferentes combinaciones de parámetros de la línea de comandos en archivos separados de lotes / secuencias de comandos para simplificar la ejecución y evitar problemas de escritura errónea.