Весенняя загрузка YML и автономный сервер Tomcat 8
у меня есть следующая структура каталогов/конфигурационный файл:
src/main/resource/config:
application.yml
application-dev.yml
application-sit.yml
Примечание в соответствии с "Bootiful Конфигурация" https://spring.io/blog/2015/01/13/configuring-it-all-out-or-12-factor-app-style-configuration-with-spring:
ботинок весны прочитает свойства в src/main/resources/application.свойства по умолчанию. Если профиль активен, он также автоматически читает в конфигурация файлы, основанные на имени профиля, например src/main/ресурсы / приложения-foo.Свойства, где foo-текущий профиль. Если библиотека Snake YML находится на пути к классам, то она будет также автоматически загружать файлы YML.
так как snake YML jar находится в пути класса, если я установил --spring.profiles.active=dev
как
программа arg в eclipse запускает конфигурацию и использует это как мой основной метод, когда - либо работающий так, как ожидалось:
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);
}
}
(пожалуйста заметьте главную ссылку метода выше от следующий класс, используемый в моем коде: https://github.com/jarias/generator-jhipster-ember/blob/master/app/templates/src/main/java/package/_Application.java)
все работает так, как ожидалось весной.профиль.active=dev. Что означает, что оба: приложение.в формате YML(загружается по умолчанию) и применение-dev.в формате YML(активный профиль) загружаются файлы свойств и исключить приложения-сидеть.в формате YML так как сидеть не активный профиль.
этот встроенный контейнер отлично подходит для тестирования разработки. Однако я хочу выпустить это в производство, создав войну и развернув ее на автономном сервере Tomcat8.
для этого я создал реализацию WebApplicationInitializer, которая требуется сервером Tomcat8 для автоматического обнаружения, начальной загрузки и запуска приложения spring на автономном сервере.
@Configuration
public class WebAppInit implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
}
}
после развертывания войны я получаю следующую ошибку I попробуйте запустить автономный сервер и получите следующую ошибку:
вызвано: org.springframework.зернышки.фабрика.введенный код hereBeanCreationException: не удалось autowire поле: частный Ява.ленг.Строка com.titlefeed.конфиг.децибел.DbConfigJPA.databaseUrl; вложенные исключением является Java.ленг.IllegalArgumentException: не удалось разрешить пружину-заполнитель.данные.и Postgres.uri ' в строковом значении "${весна.данные.и Postgres.uri}"
из которого следует сервер Tomcat / Spring нет загрузка приложения-dev.yml так как содержит свойства:весна.данные.и Postgres.Ури
поэтому я попытался выполнить следующие два решения
- добавил
-Dspring.profiles.active=dev
в JAVA_OPTS в tomcat/bin/catalina.sh - добавил
spring.profiles.active=dev
to tomcat/conf / catalina.свойства
и ни один из них не работал. Как получить автономный сервер tomcat для загрузки файла yml связано с весной.профили.активное свойство.
он отлично работает для встроенного сервера springboot, запущенного из eclipse, но не для стандартного сервера ?
EDIT1: M. Deinum - реализовано предлагаемое решение ниже, однако по-прежнему получил следующую ошибку:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.postgres.uri' in string value "${spring.data.postgres.uri}
похоже на-Dspring.профили.active=dev не устанавливается.
@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);
}
}
РЕДАКТИРОВАТЬ 2 ACV: - Добавление " -- весна.профили.active=dev " как отдельно от переменной JAVA_OPTS в сценарии запуска: tomcat/bin/catalina.sh не является жизнеспособным вариантом
например:
JAVA_OPTS="$JAVA_OPTS --spring.profiles.active=dev ...etc
выдает следующую ошибку:
непризнанный вариант: -- весна.профили.active=ошибка dev: не удалось создать виртуальную машину Java."
EDIT 3: Внесены изменения приложение.в формате YML включить следующее собственность
spring:
profiles:
active: dev
переведена войны. Пошел в расположение каталога взорванного tomcat, чтобы убедиться, что свойство присутствует веб-приложений/feedserver/веб-инф/классы/конфиг/приложения.в формате YML
и проблема все еще произошла.
EDIT 4: добавлены приложения.свойства под Tomcat разнесенный webdir: webapps / feedserver / WEB-INF/classes/application.свойства:
spring.profiles.active=dev
spring.data.postgres.uri=jdbc:postgresql://localhost:5432/feedserver
перезапущен tomcat и проблема по-прежнему произошло.
его кажется, что его не подбирая либо приложение.свойства или приложение.в формате YML
изменить 5 используется рекомендуемый способ запуска сервера spring boot для внешнего контейнера:
@Configuration
public class WebAppInit extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
Edit 6:
добавил - Dspring.профили.active=dev к команде запуска 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
однако я все еще получаю следующее исключение в логах:
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.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)
3 ответов
Кредит: @M. Deinum
есть два варианта передачи пружинных профилей в Tomcat 8.
1. установите его как переменную окружения
Tomcat позволяет установить конфигурацию среды в CATALINA_HOME/setenv.sh
или CATALINA_BASE/setenv.sh
, которые вызываются во время процесса запуска.
setenv.sh:
export SPRING_PROFILES_ACTIVE=dev
вы также можете создать src/main/resources/banner.txt
С этой строкой в нем:
active profiles :: ${spring.profiles.active}
он не будет работать в вашей IDE (он читает из манифеста jar/war.МФ файл, которого у вас не будет, если вы компилируете нормально), но это очень удобно в средах, о которых вы заботитесь-все, кроме вашей локальной среды!
2. добавьте его в сценарий/команду "Пуск" перед исполняющим классом
Я изменил CATALINA_HOME/catalina.sh
добавлена объявленная переменная:
SPRING_PROFILE="dev"
и при всех соответствующих исполнениях добавил его в скрипт:
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 "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
очевидно, это не рекомендуется подход. Но это работает! Если у вас есть точные воспроизводимые шаги для этого, рекомендуйте подход, не стесняйтесь публиковать ответ, и если он работает, я его приму.
Я столкнулся с этим, когда искал решение для передачи профиля spring на автономный сервер tomcat. В случае, если у кого-то есть такая же проблема, то, что работало для меня, добавляло свойство tomcat catalina.свойства - одна линия: весна.профили.active=dev
Попробуйте удалить подпапку "config" из пути конфигурации. Не должны ли все файлы конфигурации жить в src/main/resources
?