#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
Посмотрите на это