pom perfiles example dependencias configurar compile comandos java spring maven spring-profiles

java - example - Cómo configurar perfiles activos de primavera con perfiles de maven



maven profiles properties example (4)

Actualmente estoy construyendo una pequeña aplicación web que (por razones ajenas a mi control) tiene que poder ejecutarse en un antiguo servidor / contenedor que solo admite Servlet 2.5 y Java 6. También es necesario que la configuración de la aplicación web sea completamente autocontenido, por lo que incluso las variables del sistema y / o los parámetros de JVM no se pueden usar. El administrador solo quiere un archivo .war para cada entorno que se puede colocar en el contenedor para su implementación.

Estoy usando Spring 4.x en mi aplicación web. Así es como configuré mi aplicación de manera que el perfil Maven activo se usa para establecer el perfil activo de Spring 4.x.

cambios en el archivo pom.xml

Agregué los siguientes bits a mi archivo POM. Mi POM está usando la versión de modelo 4.0.0 y estoy ejecutando Maven 3.1.x cuando hago mis compilaciones.

<modelVersion>4.0.0</modelVersion> ... <profiles> <profile> <id>dev</id> <activation> <!-- Default to dev so we avoid any accidents with prod! :) --> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- This can be a single value, or a comma-separated list --> <spring.profiles.to.activate>dev</spring.profiles.to.activate> </properties> </profile> <profile> <id>uat</id> <properties> <!-- This can be a single value, or a comma-separated list --> <spring.profiles.to.activate>uat</spring.profiles.to.activate> </properties> </profile> <profile> <id>prod</id> <properties> <!-- This can be a single value, or a comma-separated list --> <spring.profiles.to.activate>prod</spring.profiles.to.activate> </properties> </profile> </profiles> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <webResources> <webResource> <filtering>true</filtering> <directory>src/main/webapp</directory> <includes> <include>**/web.xml</include> </includes> </webResource> </webResources> <failOnMissingWebXml>true</failOnMissingWebXml> </configuration> </plugin> ... </plugins> </build>

cambios en el archivo web.xml

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Setup for root Spring context --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-core-config.xml</param-value> </context-param> <!-- Jim Tough - 2016-11-30 Per Spring Framework guide: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-environment ...profiles may also be activated declaratively through the spring.profiles.active property which may be specified through system environment variables, JVM system properties, servlet context parameters in web.xml, or even as an entry in JNDI. --> <context-param> <param-name>spring.profiles.active</param-name> <param-value>${spring.profiles.to.activate}</param-value> </context-param> <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

Ahora puedo crear clases de configuración basadas en Java como la siguiente que solo se usará cuando un determinado perfil de Spring esté activo.

@Configuration @Profile({"dev","default"}) @ComponentScan @EnableTransactionManagement @EnableSpringDataWebSupport public class PersistenceContext { // ... }

Tengo una aplicación con maven como herramienta de compilación.

Estoy usando perfiles maven para configurar diferentes propiedades de diferentes perfiles.

Lo que me gustaría hacer es que todos los perfiles activos en maven también se transfieran a los perfiles activos de primavera para que pueda hacer referencia a ellos en la firma de bean ( @profile ). pero no estoy seguro de cómo hacerlo.

por ejemplo: considere la siguiente configuración de maven

<profiles> <profile> <id>profile1</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> </properties> </profile> <profile> <id>profile2</id> <properties> </properties> </profile> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> </properties> </profile> <profile> <id>production</id> <properties> </properties> </profile> </profiles>

Suponiendo que ejecuto Maven sin especificar ningún otro perfil, me gustaría que Spring tenga profile1 y development como perfiles activos.


Hay una manera más elegante de cambiar entre 2 perfiles maven + spring simultáneamente.

Primero , agregue perfiles a POM (preste atención - el perfil maven + spring se activa por una sola variable de sistema):

<profiles> <profile> <id>postgres</id> <activation> <activeByDefault>true</activeByDefault> <property> <name>spring.profiles.active</name> <value>postgres</value> </property> </activation> <dependencies> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901.jdbc4</version> </dependency> </dependencies> </profile> <profile> <id>h2</id> <activation> <property> <name>spring.profiles.active</name> <value>h2</value> </property> </activation> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.191</version> </dependency> </dependencies> </profile> </profiles>

En segundo lugar , configure el perfil predeterminado para la primavera (para maven, ya está configurado en POM). Para la aplicación web, inserté las siguientes líneas en web.xml :

<context-param> <param-name>spring.profiles.default</param-name> <param-value>postgres</param-value> </context-param>

En tercer lugar , agregue beans dependientes del perfil a su configuración. En mi caso (configuración XML), es:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="mainDataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> <property name="jpaProperties" ref="hibProps"/> <property name="packagesToScan"> <list> <value>my.test.model</value> </list> </property> </bean> ... <beans profile="postgres"> <bean name="mainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://127.0.0.1:5432/webchat" /> <property name="username" value="postgres" /> <property name="password" value="postgres" /> </bean> </beans> <beans profile="h2"> <bean name="mainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.h2.Driver" /> <property name="url" value="jdbc:h2:file:./newsdb;INIT=RUNSCRIPT FROM ''classpath:init.sql'';TRACE_LEVEL_FILE=0" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean> </beans>

Ahora es posible:

  • Ejecutar mi aplicación web en Postgres DB con mvn jetty:run o mvn jetty:run -Dspring.profiles.active=postgres comandos de mvn jetty:run -Dspring.profiles.active=postgres
  • Ejecutar mi aplicación web en H2 DB con mvn clean jetty:run -Dspring.profiles.active=h2

Lo primero que necesita son dos archivos de propiedades para mantener sus configuraciones. Los nombres de los archivos deben coincidir con la aplicación de patrón- {custom_suffix} .properties. Créelos en el directorio src / main / resources de su proyecto Maven, junto al archivo principal application.properties, que luego va a usar para activar uno de los otros y para mantener los valores compartidos por ambos perfiles.

Entonces es hora de modificar tu pom.xml. Debe definir una propiedad personalizada en cada uno de sus perfiles de Maven y establecer sus valores para que coincidan con los sufijos de los archivos de propiedades correspondientes que desee cargar con un perfil en particular. El siguiente ejemplo también marca el primer perfil que se ejecutará de manera predeterminada, pero no es obligatorio.

<profile> <id>dev</id> <properties> <activatedProperties>dev</activatedProperties> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>release</id> <properties> <activatedProperties>release</activatedProperties> </properties> </profile>

A continuación, en la sección de compilación del mismo archivo, configure el filtrado para el Complemento de recursos. Esto le permitirá insertar propiedades definidas en el paso anterior en cualquier archivo en el directorio de recursos, que es el paso siguiente.

<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> … </build>

Finalmente, agregue la siguiente línea a application.properties.

spring.profiles.active=@activatedProperties@

Cuando se ejecuta la construcción, el complemento de recursos reemplazará el marcador de posición con el valor de la propiedad definida en el perfil de Maven activo. Después de iniciar su aplicación, Spring Framework cargará el archivo de configuración apropiado basado en el nombre del perfil Spring activo, que se describe por el valor de la propiedad spring.profiles.active. Tenga en cuenta que Spring Boot 1.3 reemplazó la sintaxis predeterminada del Plugin de recursos para los valores filtrados y usa la notación @activatedProperties@ lugar de ${activatedProperties} .

Funcionó a la perfección. Espero que esto le pueda ayudar.


Tendrá que filtrar los recursos de su aplicación, por ejemplo, un archivo de propiedad, que contiene la información de qué perfil activar en primavera.

Por ejemplo

spring.profile = ${mySpringProfile}

Y para cada perfil, defina un valor para esta variable ( mySpringProfile ).

Durante la creación, esto se filtrará de acuerdo con el valor definido en el perfil actualmente activo.

Luego, durante el arranque de su aplicación, seleccionará el perfil apropiado de acuerdo con este archivo (no puede ayudarlo más ya que no nos dio más información, pero esto es bastante fácil).

Nota : No puedo encontrar una manera de obtener el perfil activo actualmente en maven (algo así como project.profiles.active que contiene tus valores -P), es por eso que tendrás que establecer una nueva variable para cada perfil.

Nota 2 : si está ejecutando una aplicación web, en lugar de utilizar este archivo intermedio, filtre este valor en su web.xml

<context-param> <param-name>spring.profiles.active</param-name> <param-value>${mySpringProfile}</param-value> </context-param>

Nota 3 : Esto es realmente una mala práctica, y debe establecer el perfil en tiempo de ejecución con una propiedad del sistema