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
- aggiunto
-Dspring.profiles.active=dev
a JAVA_OPTS in Tomcat/bin/catalina.sh - 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)
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html provare l'impostazione: --spring.profiles.active = dev – ACV
Perché lo stai facendo sbagliato, usa una sottoclasse dello speciale 'SpringBootServletInitializer'. Come spiegato nella guida di riferimento per l'avvio della molla. –
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