Расположение файла конфигурации Spring Boot из Tomcat

#spring-boot #tomcat

#spring-boot #tomcat

Вопрос:

Я пытаюсь настроить серверное приложение так, чтобы оно получало разные файлы конфигурации в зависимости от env.

В среде разработки я хотел бы загрузить приложение по умолчанию.yml из classpath. Это должно быть в том случае, когда я запускаю приложение через: mvn spring-boot:run или java -jar ./target/myapp.war

Но когда это приложение запущено на Tomcat, оно должно загрузить приложение.yml из файла, специфичного для сервера, например, /etc/apps/myapp/application.yml (не из classpath по умолчанию), поскольку сервер имеет другие учетные данные mongodb и т.д…

Я не хочу использовать profiles , потому что это означает, что мне нужно поместить учетные данные сервера в проект на github в application.yml. Я просто хочу, чтобы это было известно администратору сервера, а разработчик ничего об этом не знал.

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

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

Ответ №1:

Вы можете использовать @PropertyResource аннотацию с контекстным XML.
ПРИМЕЧАНИЕ: ignoreResourceNotFound поможет не создавать исключение, когда файл не найден, скажем, для Dev env.

 @Configuration
  @PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource(value = "file:${config.file}", ignoreResourceNotFound=true)
    })
public class AppConfig {
    //...
}
  

/META-INF/context.xml

 <Context>
    <Parameter name="config.file" value="/yourpath/application.properties"/>
</Context>
  

Если вы не хотите сохранять path в context.xml внутри вашего проекта существуют другие способы определения контекста на уровне приложения в зависимости от вашей версии tomcat. Пожалуйста, обратитесь сюда для получения подробной информации о tomcat 9.

Ответ №2:

Если вы хотите прочитать свойства из внешнего расположения, то напишите bootstrap.yml в своем приложении и удалите application.yml .

bootstrap.yml:

 spring:
  config:
    location: file:/home/external/properties/location/
    name: application
  profiles:
    active: dev
  

расположение файла: /home/external/properties/location/

предположим, вам нужна среда разработки и prod.Затем сохраните эти 3 файла свойств в этом расположении.

 application.yml

application-dev.yml

application-prod.yml
  

Сначала Spring boot прочитает application.yml свойства. Если установить активный профиль dev в bootstrap.yml , то application.yml значение перезаписать на application-dev.yml .

Или вы можете использовать config server

Посмотрите на это