Весенняя загрузка 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.Ури

поэтому я попытался выполнить следующие два решения

  1. добавил -Dspring.profiles.active=dev в JAVA_OPTS в tomcat/bin/catalina.sh
  2. добавил 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 ?