Solución:
Existe una forma más elegante de cambiar entre 2 perfiles maven + resorte simultáneamente.
Primero, agregue perfiles a POM (preste atención: el perfil de resorte + maven se activa mediante una sola variable del 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>
Segundo, configure el perfil predeterminado para la primavera (para maven ya está configurado en POM). Para la aplicación web, inserté las siguientes líneas para web.xml
:
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>postgres</param-value>
</context-param>
Tercera, agregue beans dependientes del perfil a su config. 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:
- Ejecute mi aplicación web en Postgres DB con
mvn jetty:run
omvn jetty:run -Dspring.profiles.active=postgres
comandos - Ejecute 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 application.properties principal, que usará más adelante para activar uno de los otros y mantener los valores compartidos por ambos perfiles.
Entonces es el momento de modificar su 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 desea cargar con un perfil en particular. El siguiente ejemplo también marca el primer perfil que se ejecutará de forma 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. Eso 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.
[email protected]@
Cuando se ejecuta la compilació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, el marco Spring cargará el archivo de configuración apropiado según el nombre del perfil Spring activo, que se describe mediante el valor de la propiedad spring.profiles.active. Tenga en cuenta que Spring Boot 1.3 reemplazó la sintaxis del complemento de recursos predeterminado para los valores y usos filtrados @[email protected]
en lugar de ${activatedProperties}
notación.
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 compilación, esto se filtrará de acuerdo con el valor definido en el perfil activo actualmente.
Luego, durante el arranque de su aplicación, seleccionará el perfil apropiado de acuerdo con este archivo (no puedo ayudarlo más porque no nos brindó más información, pero esto es bastante fácil.
Nota: No puedo encontrar una manera de obtener el perfil actualmente activo en maven (algo así como project.profiles.active que contiene sus valores -P), es por eso que tendrá que establecer una nueva variable para cada perfil.
Nota 2: si está ejecutando una aplicación web, en lugar de usar 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: Esta es en realidad una mala práctica, y debe configurar el perfil en tiempo de ejecución con una propiedad del sistema