Весенняя загрузка WAR в tomcat - экстернализация приложения. Свойства - PullRequest
2 голосов
/ 11 июня 2019

У меня есть загрузочное приложение Spring, которое упаковано как WAR и развернуто в Tomcat. Он развернут таким образом из-за некоторых унаследованных проблем.

У меня возникли проблемы с экстернализацией application.properties
Команда разработчиков DevOps требует, чтобы файл находился в / app / shared / conf /
Я нашел много вопросов на эту тему, но ни одно из решений не работает ...
Это то, что я пробовал до сих пор:

добавлено в tomcat's Context.xml:

<Parameter name="spring.config.location" value="/app/shared/conf/application.properties" />

добавлено в startup.sh:

export spring_config_location=/app/shared/conf/

добавлено в startup.sh:

export SPRING_CONFIG_LOCATION=/app/shared/conf/application.properties

добавляется в startup.sh, а установка этого параметра в SecurityConfig расширяет WebSecurityConfigurerAdapter

CLASSPATH=/app/shared/conf/
@PropertySource("classpath:application.properties")

Добавлено в основной класс приложения:

 System.setProperty("spring.config.location", "/app/shared/conf/application.properties");

Добавлено в SecurityConfig расширяет WebSecurityConfigurerAdapter

@PropertySource("file:/app/shared/conf/application.properties")

Это ошибка, которую я продолжаю получать:

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::             (v2.2.0.M1)

11-Jun-2019 02:54:22.034 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/prntPrtl]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:986)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThrexeroxoolExecutor.runWorker(ThrexeroxoolExecutor.java:1142)
    at java.util.concurrent.ThrexeroxoolExecutor$Worker.run(ThrexeroxoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.xerox.printHub.app.PrinterPortal]; nested exception is java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:785)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:407)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5204)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 10 more
Caused by: java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180)
    at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:159)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:99)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:73)
    at org.springframework.core.io.support.PropertiesLoaderUtils.loxeroxroperties(PropertiesLoaderUtils.java:59)
    at org.springframework.core.io.support.ResourcePropertySource.<init>(ResourcePropertySource.java:67)
    at org.springframework.core.io.support.DefaultPropertySourceFactory.createPropertySource(DefaultPropertySourceFactory.java:37)
    at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:452)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:271)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
    ... 26 more

1 Ответ

2 голосов
/ 13 июня 2019

Документация содержит несколько важных замечаний:

spring.config.name и spring.config.location используются очень рано, чтобы определить, какие файлы должны быть загружены, поэтому они должны быть определены как свойство среды (обычно это переменная среды ОС, системное свойство или команда строковый аргумент).

и

Если spring.config.location содержит каталоги (в отличие от файлов), они должны заканчиваться на / (и, во время выполнения, дополняться именами, сгенерированными из spring.config.name перед загрузкой, включая файл конкретного профиля имена). Файлы, указанные в spring.config.location, используются как есть, без поддержки вариантов, специфичных для профиля, и переопределяются любыми свойствами, специфичными для профиля.

и

Когда настраиваемые местоположения конфигурации настраиваются с использованием spring.config.location, они заменяют местоположения по умолчанию.

и, наконец,

Если вы указали какие-либо файлы в spring.config.location, профильные варианты этих файлов не рассматриваются. Используйте каталоги в spring.config.location, если вы также хотите использовать специфичные для профиля свойства.

So

  • Вероятно, лучше использовать каталоги, чем файлы в spring.config.location
  • Добавьте каталог в каталоги по умолчанию, если они вам не нужны.
  • Убедитесь, что каталоги заканчиваются косой чертой.
  • Вам также необходимо использовать протокол file: для ссылки на файл вне пути к классам.

В итоге, это должно работать: экспортировать переменную окружения в setenv.sh скрипт

Tomcat *
export SPRING_CONFIG_LOCATION=classpath:/,classpath:/config/,file:./,file:./config/,file:/app/shared/conf/

или вместо этого используйте системное свойство (-Dspring.config.location) или флаг командной строки (--spring.config.location).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...