java - example - spring profiles baeldung
Perfil predeterminado en Spring 3.1 (7)
Acerca de establecer el perfil de producción predeterminado ya publicado @andih
La manera más fácil de configurar el perfil predeterminado para el plugin maven jetty es incluir el siguiente elemento en la configuración del complemento:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<systemProperties>
<systemProperty>
<name>spring.profiles.active</name>
<value>demo</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>
En mi aplicación, he frijoles anotados con @Profile("prod")
y @Profile("demo")
. El primero, como se puede adivinar :), se usa en beans que se conectan a DB de producción y el segundo anota frijoles que usan algún DB falso ( HashMap
o lo que sea) para acelerar el desarrollo.
Lo que me gustaría tener es un perfil predeterminado ( "prod"
) que se usará siempre si no se reemplaza por " something-else ".
Perfecto sería tener en mi web.xml
:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>prod</param-value>
</context-param>
y luego anular esto con -Dspring.profiles.active="demo"
para que yo pueda:
mvn jetty:run -Dspring.profiles.active="demo".
Pero lamentablemente esto no está funcionando. ¿Alguna idea de cómo podría lograr eso? Establecer -Dspring.profiles.active="prod"
en todos mis entornos no es una opción.
Defina su entorno de producción como perfil predeterminado en su web.xml
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>prod</param-value>
</context-param>
y si desea utilizar un perfil diferente, páselo como propiedad del sistema
mvn -Dspring.profiles.active="demo" jetty:run
Mi experiencia es que usar
@Profile("default")
el bean solo se agregará al contexto si no se identifica ningún otro perfil. Si -Dspring.profiles.active="demo"
un perfil diferente, por ejemplo, -Dspring.profiles.active="demo"
, se ignora este perfil.
Puede configurar su web.xml como recurso filtrado y tener este valor rellenado por maven desde la configuración del perfil de maven: eso es lo que hacemos.
en pom filtra todos los recursos (puedes hacerlo si no tienes $ {} marcado en ellos)
<webResources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</webResources>
en web.xml puesto
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>${spring.prfile}</param-value>
</context-param>
en pom crear perfiles de maven
<profiles>
<profile>
<id>DEFAULT</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profile>prod</spring.profile>
</properties>
<profile>
<profile>
<id>DEMO</id>
<properties>
<spring.profile>demo</spring.profile>
</properties>
<profile>
</profiles>
Ahora puedes usar
mvn jetty:run -P DEMO
o simplemente -P DEMO
con cualquier comando maven
Spring proporciona dos propiedades separadas al determinar qué perfiles están activos:
-
spring.profiles.active
y
-
spring.profiles.default
Si se establece spring.profiles.active
, su valor determina qué perfiles están activos. Pero si spring.profiles.active
no está configurado, Spring ve a spring.profiles.default.
Si no se spring.profiles.active
ni spring.profiles.active
ni spring.profiles.default
, no hay perfiles activos, y solo se spring.profiles.default
los beans que no están definidos como pertenecientes a un perfil. Cualquier bean que no especifique un perfil pertenece a perfil default
También puede considerar eliminar el perfil PROD y usar @Profile ("! Demo")
Tengo el mismo problema, pero utilizo WebApplicationInitializer para configurar ServletContext mediante programación (Servlet 3.0+). Entonces hago lo siguiente:
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext sc) throws ServletException {
// Create the ''root'' Spring application context
final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
// Default active profiles can be overridden by the environment variable ''SPRING_PROFILES_ACTIVE''
rootContext.getEnvironment().setDefaultProfiles("prod");
rootContext.register(AppConfig.class);
// Manage the lifecycle of the root application context
sc.addListener(new ContextLoaderListener(rootContext));
}
}