2015-09-01 18 views
6

Ho la seguente struttura di directory/file di configurazione:primavera Boot YML e StandAlone Tomcat 8 Server

src/main/resource/config: 
application.yml 
application-dev.yml 
application-sit.yml 

nota secondo la "configurazione Bootiful" https://spring.io/blog/2015/01/13/configuring-it-all-out-or-12-factor-app-style-configuration-with-spring:

Spring Boot will read the properties in src/main/resources/application.properties by default. If a profile is active, it will also automatically reads in the configuration files based on the profile name, like src/main/resources/application-foo.properties where foo is the current profile. If the Snake YML library is on the classpath, then it will also automatically load YML files.

Dal serpente YML jar è nel percorso della classe se ho impostato --spring.profiles.active=dev come un programma arg nella configurazione di esecuzione di eclipse e uso questo come il mio metodo principale Ever thing funziona come previsto:

public static void main(String[] args) { 
     SpringApplication app = new SpringApplication(Application.class); 

     SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args); 

     // Check if the selected profile has been set as argument. 
     // if not the development profile will be added 
     addDefaultProfile(app, source); 

     app.run(args); 
    } 

    /** 
    * Set a default profile if it has not been set 
    */ 
    private static void addDefaultProfile(SpringApplication app, SimpleCommandLinePropertySource source) { 
     if (!source.containsProperty("spring.profiles.active")) { 
      app.setAdditionalProfiles(Constants.SPRING_PROFILE_DEVELOPMENT); 
     } 
    } 

(Si prega di notare il metodo di riferimento principale di cui sopra è dalla classe seguente utilizzato nel mio codice: https://github.com/jarias/generator-jhipster-ember/blob/master/app/templates/src/main/java/package/_Application.java)

Tutto funziona come previsto per spring.profile.active = dev. Il che significa che sia: application.yml (caricate di default) e application-dev.yml (profilo attivo) i file di proprietà vengono caricati e escludeapplicazione sit.yml dal sit non è un attivo profilo.

Questo contenitore integrato è ideale per i test di sviluppo. Tuttavia, voglio rilasciare questo in produzione generando una guerra e distribuirla su un server Tomcat8 indipendente.

Per questo ho creato un'implementazione di WebApplicationInitializer che è richiesta dal server Tomcat8 per rilevare automaticamente, avviare e avviare l'applicazione molla sul server standalone.

@Configuration 
public class WebAppInit implements WebApplicationInitializer { 


    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); 
     } 
} 

Dopo la distribuzione della guerra ricevo il seguente errore che tenta di avviare il server autonomo e visualizzato il seguente errore:

Caused by: org.springframework.beans.factory.enter code hereBeanCreationException: Could not autowire field: private java.lang.String com.titlefeed.config.db.DbConfigJPA.databaseUrl; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder spring.data.postgres.uri' in string value "${spring.data.postgres.uri}"

che implica la Tomcat Server/Primavera isnt caricamento del applicazione- dev.yml poiché contiene le proprietà: spring.data.postgres.uri

Quindi ho tentato le seguenti due soluzioni

  1. aggiunto -Dspring.profiles.active=dev a JAVA_OPTS in Tomcat/bin/catalina.sh
  2. aggiunto spring.profiles.active=dev Tomcat/conf/catalina.properties

E nessuno di loro ha lavorato. Come posso ottenere il server tomcat standalone per caricare il file yml associato alla proprietà spring.profiles.active.

Funziona correttamente per il server Springboot incorporato avviato da Eclipse ma non per un server standalone?

MODIFICA 1: M.Deinum - Attuato la soluzione suggerita di seguito però ancora ottenuto il seguente errore:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.postgres.uri' in string value "${spring.data.postgres.uri}

Sembra che il -Dspring.profiles.active = dev non è sempre impostato.

@Configuration 
public class WebAppInit extends SpringBootServletInitializer { 

@Override 

    protected WebApplicationContext createRootApplicationContext(
      ServletContext servletContext) { 
      log.info("Properly INITALIZE spring CONTEXT"); 
      ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); 
      servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context); 
      return super.createRootApplicationContext(servletContext); 
    } 

} 

EDIT 2 ACV: - Aggiunta "--spring.profiles.active = dev", come parte di variabili JAVA_OPTS nello script di avvio: Tomcat/bin/catalina.sh non è una valida opzione

Ad esempio:

JAVA_OPTS="$JAVA_OPTS --spring.profiles.active=dev ...etc 

dà il seguente errore:

Unrecognized option: --spring.profiles.active=dev Error: Could not create the Java Virtual Machine."

EDIT 3: Modificato application.yml per includere la seguente proprietà

spring: 
    profiles: 
    active: dev 

riassegnare la guerra. Sono andato alla posizione della directory tomcat esplosa per garantire la proprietà era webapps/feedserver/WEB-INF/classes/config/application.yml

E il problema si è verificato ancora.

EDIT 4: application.properties aggiunto sotto il tomcat esplosa WEBDIR: webapps/feedserver/WEB-INF/classes/application.properties:

spring.profiles.active=dev 
spring.data.postgres.uri=jdbc:postgresql://localhost:5432/feedserver 

tomcat rinnovate e la questione ancora avvenute.

La sua sembra come il suo non raccogliere né application.properties o application.yml

EDIT 5 Utilizzato il metodo consigliato per avviare il server di avvio di primavera per un contenitore esterno:

@Configuration 
public class WebAppInit extends SpringBootServletInitializer { 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
} 

} 

Edit 6:

Ho aggiunto -Dspring.profiles.active = dev per il comando di avvio args:

/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -Djava.util.logging.config.file=/Users/shivamsinha/Desktop/Programming/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dlog4j.rootLevel=ERROR -Dlog4j.rootAppender=console -DENV=dev -Dlog4j.configuration=/WEB-INF/classes/properties/log4j.properties -DTOMCAT_DIR=WEB-INF/classes/ -Djava.endorsed.dirs=/Users/shivamsinha/Desktop/Programming/tomcat/endorsed -classpath /Users/shivamsinha/Desktop/Programming/tomcat/bin/bootstrap.jar:/Users/shivamsinha/Desktop/Programming/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/Users/shivamsinha/Desktop/Programming/tomcat -Dcatalina.home=/Users/shivamsinha/Desktop/Programming/tomcat -Djava.io.tmpdir=/Users/shivamsinha/Desktop/Programming/tomcat/temp org.apache.catalina.startup.Bootstrap -Dspring.profiles.active=dev start 

Comunque stil ottengo la seguente eccezione nei registri:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.titlefeed.config.db.DbConfigJPA.databaseUrl; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.postgres.uri' in string value "${spring.data.postgres.uri}" 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 68 more 
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.postgres.uri' in string value "${spring.data.postgres.uri}" 
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) 
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) 
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204) 
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178) 
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:801) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:955) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    ... 70 more 

02-Sep-2015 03:15:40.472 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive /Users/shivamsinha/Desktop/Programming/tomcat/webapps/feedserver-1.0.0.war 
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/feedserver-1.0.0]] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:728) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
+0

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html provare l'impostazione: --spring.profiles.active = dev – ACV

+1

Perché lo stai facendo sbagliato, usa una sottoclasse dello speciale 'SpringBootServletInitializer'. Come spiegato nella guida di riferimento per l'avvio della molla. –

+0

Penso che abbiamo lo stesso problema. Vedi https://stackoverflow.com/questions/32326965/how-to-pass-spring-boot-argument-to-tomcat-deployment Ma al momento non esiste una soluzione, giusto? – Charmin

risposta

4

Credito: @M. Deinum

Ci sono due opzioni per il passaggio degli argomenti di profilo molla in Tomcat 8.

1. impostarlo come variabile di ambiente

Tomcat consente di impostare config ambiente in CATALINA_HOME/setenv.sh o CATALINA_BASE/setenv.sh che vengono chiamati durante il processo di avvio.

setenv.sh: 
export SPRING_PROFILES_ACTIVE=dev 

Si potrebbe anche voler creare un src/main/resources/banner.txt con questa linea in esso:

active profiles  :: ${spring.profiles.active} 

non funzionerà nel vostro IDE (si legge dal file MANIFEST.MF vostro vaso/della guerra, che non lo avrai se lo stai compilando normalmente), ma è DAVVERO utile negli ambienti a cui tieni, MA TUTTO il tuo ambiente locale!

2. Aggiungilo alla partenza script/comando prima della prima della classe di eseguire

ho modificato CATALINA_HOME/catalina.sh aggiunto una variabile dichiarata:

SPRING_PROFILE="dev"

E in tutte le pertinenti esecuzioni aggiunti it to script:

eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ 
     -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ 
     -Dcatalina.base="\"$CATALINA_BASE\"" \ 
     -Dcatalina.home="\"$CATALINA_HOME\"" \ 
     -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ 
     -Dspring.profiles.active="\"$SPRING_PROFILE\"" \ 
     org.apache.catalina.startup.Bootstrap "[email protected]" start \ 
     >> "$CATALINA_OUT" 2>&1 "&" 

Ovviamente questo non è l'approccio raccomandato. Ma funziona! Se hai i passi esatti replicabili per farlo, l'approccio consigliato non esitare a postare la risposta e se funziona lo accetto.

+0

Quando su una variante UNIX usa 'SPRING_PROFILES_ACTIVE' che funzionerà anche. –

-1

Prova con la rimozione del "config "sottocartella dal percorso di configurazione. Non dovrebbero tutti i file di configurazione vivere in src/main/resources?

+0

già provato. Produce lo stesso errore. –

+0

Dimitri. Cerchiamo anche 'config' per impostazione predefinita, controlla [la documentazione] (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application- file di proprietà) –

+0

Giusto, scusa. Ho esaminato la documentazione iniziale del post sul blog.Avrebbe dovuto postare il suggerimento come commento, non come risposta. –

Problemi correlati