2012-04-06 29 views
91

Nella mia applicazione ho i fagioli annotati con @Profile("prod") e @Profile("demo"). Il primo, come si può intuire :), viene utilizzato sui bean che si collegano al DB di produzione e il secondo annota i bean che utilizzano un DB falso (HashMap o altro) per rendere lo sviluppo più veloce.Profilo predefinito in primavera 3.1

Quello che vorrei avere è il profilo predefinito ("prod") che verrà utilizzato sempre se non viene sovrascritto da "qualcosa-else".

perfetto sarebbe quello di avere nel mio web.xml:

<context-param> 
    <param-name>spring.profiles.active</param-name> 
    <param-value>prod</param-value> 
</context-param> 

e poi sostituire questo con -Dspring.profiles.active="demo" in modo che potessi fare:

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

Ma purtroppo questo non sta funzionando. Qualche idea su come potrei riuscirci? L'impostazione di -Dspring.profiles.active="prod" su tutti i miei ambienti non è un'opzione.

risposta

57

La mia esperienza è che l'utilizzo

@Profile("default") 

il fagiolo sarà aggiunto solo al contesto se nessun altro profilo viene identificato. Se passi in un profilo diverso, ad es. -Dspring.profiles.active="demo", questo profilo è ignorato.

+4

La risposta accettata dipende da web.xml (e va bene), ma questa risposta funziona se hai web.xml o no e quindi è più largamente utile a tutti. – Jay

+1

questa soluzione è molto più pulita – cahen

+0

Si tratta di una funzione ufficiale o di qualche effetto collaterale? Vorresti collegarti alla documentazione di Spring dove è descritta questa funzionalità? – rustyx

108

definire il vostro ambiente di produzione, come profilo predefinito nel vostro web.xml

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

e se si desidera utilizzare un diverso passaggio profilo come proprietà di sistema

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

No ha tentato di definire il profilo ** attivo ** nel web.xml e come proprietà di sistema. Nella mia soluzione configuro un profilo ** predefinito ** nel web.xml e sovrascrivo/definisco il profilo * active * tramite la proprietà di sistema. Se non esiste un profilo * attivo * esplicito, verrà utilizzato il valore predefinito. – andih

+0

Grazie! questo è esattamente quello che volevo! impossibile trovarlo da nessuna parte:/ –

+0

Un problema con questo approccio: se si imposta 'spring.profiles.default = prod' in' application.properties', quindi 'application-prod.properties' non verrà caricato. Questo è contro-intuitivo. – gamliela

-1

È possibile regolare il web. xml come risorsa filtrata e avere questo valore riempito da Maven dalle impostazioni del profilo di Maven - quello che facciamo.

filtro pom tutte le risorse (che si può fare taht se non hai $ {} marcatura in loro)

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

in web.xml messo

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

nel pom creare profili 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> 

Ora è possibile utilizzare

mvn jetty:run -P DEMO 

o semplicemente -P DEMO con qualsiasi comando Maven

+1

Non sono sicuro, ma penso che non funzionerà. IMHO jetty: run non eseguirà la fase in cui vengono filtrate le risorse. –

+0

dell'infermiera devi eseguire mvn clean compile jetty: esegui DEM DEMO, ma con codice non compilato lo esegue in modo automatico – Hurda

+10

Capisco che uno degli obiettivi principali di Spring 3.1 Profiles è generare un singolo file WAR pronto per essere distribuito in tutti gli ambienti Usare i profili Maven è un passo indietro allo stato precedente: dove era necessario il pacchetto di un file WAR per ogni ambiente ... – edrabc

3

Informazioni sull'impostazione profilo di produzione di default già postato @andih

Il modo più semplice per impostare il profilo predefinito per il plugin Maven pontile, è quello di includere sotto elemento nella configurazione del 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

Si può anche prendere in considerazione rimuovere il profilo PROD e usare @Profile ("!demo ")

+2

Suppongo che questo non funzionerebbe nel caso in cui tu abbia più di due profili, giusto? – Chop

5

Ho lo stesso problema, ma io uso WebApplicationInitializer al fine di configurare il ServletContext di programmazione (Servlet 3.0+) Così faccio la seguente:.

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 fornire due proprietà distinte per determinare quali profili sono attivi:

  • spring.profiles.active

e

  • spring.profiles.default

Se spring.profiles.active è impostato, allora il suo valore determina quali profili sono attivi. Ma se spring.profiles.active non è impostata, poi primavera sembra spring.profiles.default.

Se né spring.profiles.activespring.profiles.default è impostato, allora non ci sono profili attivi, e solo i fagioli che non sono definiti come essere in un profilo sono created.Any il bean che non specifica un profilo appartiene al profilo default.

Problemi correlati