2012-04-06 23 views
91

En mi aplicación tengo beans anotados con @Profile("prod") y @Profile("demo"). El primero, como puede adivinar :), se usa en beans que se conectan a DB de producción y el segundo anota beans que usan algún DB falso (HashMap o lo que sea) - para acelerar el desarrollo.Perfil predeterminado en Spring 3.1

Lo que me gustaría tener es el perfil por defecto ("prod") que se utilizará siempre si no se reemplaza por "algo -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 pudiera hacer:

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.

Respuesta

57

Mi experiencia es que el uso de

@Profile("default") 

el grano sólo se añadió al contexto si se identifica ningún otro perfil. Si pasa un perfil diferente, p. -Dspring.profiles.active="demo", este perfil se ignora.

+4

La respuesta aceptada depende de web.xml (y eso está bien), pero esta respuesta funciona ya sea tienes web.xml o no, por lo que es más útil para todos. – Jay

+1

esta solución es mucho más limpia – cahen

+0

¿Es esta una característica oficial o algún efecto secundario? ¿Le gustaría vincular a la documentación de Spring donde se describe esta característica? – rustyx

108

definir su entorno de producción como el 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 distinto pase como propiedad del sistema

mvn -Dspring.profiles.active="demo" jetty:run 
+3

No, intentó definir el perfil ** activo ** en el web.xml y como propiedad del sistema. En mi solución, configuro un perfil ** predeterminado ** en el web.xml y sobrescribo/defino el perfil * activo * a través de la propiedad del sistema. Si no hay un perfil * activo * explícito, se usará el predeterminado. – andih

+0

¡Gracias! esto es exactamente lo que quería! no lo pude encontrar en ninguna parte:/ –

+0

Un problema con este enfoque: si establece 'spring.profiles.default = prod' en' application.properties', entonces 'application-prod.properties' no se cargará. Esto es contrario a la intuición. – gamliela

-1

Usted puede configurar su web. xml como recurso filtrado y tiene este valor rellenado por maven desde la configuración de perfil de maven: eso es lo que hacemos.

en el filtro pom todos los recursos (que puede hacer taht si no tienes $ {} marcado en ellos)

<webResources> 
    <resource> 
     <directory>src/main/webapp</directory> 
     <filtering>true</filtering> 
    </resource> 
</webResources> 

en web.xml poner

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

mvn jetty:run -P DEMO 

o simplemente -P DEMO con cualquier comando experto

+1

No estoy seguro, pero creo que eso no funcionará. IMHO embarcadero: ejecutar no ejecutará la fase en la que se filtran los recursos. –

+0

de caurse necesita ejecutar mvn clean compilar: ejecuta -P DEMO, pero con código no compilado lo ejecuta automáticamente – Hurda

+10

Entiendo que uno de los objetivos principales de Spring 3.1 Profiles es generar un único archivo WAR listo para implementarse en todos los ambientes. El uso de perfiles de Maven es un paso atrás al estado anterior: donde se necesitaba el empaquetado de un archivo WAR para cada entorno ... – edrabc

3

Acerca de la configuración por defecto perfil de producción ya publicado @andih

La forma más sencilla de configurar el perfil predeterminado para el plugin de Maven embarcadero, es incluir a continuación elemento en la configuración de plugin:

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

También puede considerar eliminando el perfil de PROD, y usa @Profile ("!demo ")

+2

Supongo que esto no funcionaría en caso de que tenga más de dos perfiles, ¿verdad? – Chop

5

tengo el mismo problema, pero yo uso WebApplicationInitializer con el fin de configurar la programación ServletContext (Servlet 3.0 o superior) Así que 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)); 
    } 
} 
1

primavera proporcionan dos propiedades separadas para determinar que los perfiles están activos:

  • spring.profiles.active

y

  • spring.profiles.default

Si spring.profiles.active se establece, entonces su valor determina qué perfiles están activos. Pero si spring.profiles.active no está definida, entonces la primavera se ve a spring.profiles.default.

Si ninguno spring.profiles.active ni spring.profiles.default se establece, entonces no hay perfiles activos, y sólo aquellos granos que no están definidos como miembros de un perfil se created.Any El bean que no especifica un perfil pertenece al perfil default.

Cuestiones relacionadas