Как экспортировать application.properties в веб-сервер Tomcat для Spring?
SpringApplication загрузит свойства из файлов application.properties в следующих местах и добавит их в среду Spring:
- A /config subdirectory of the current directory. - The current directory - A classpath /config package - The classpath root
Список упорядочен по приоритету (свойства, определенные в местоположениях выше в списке, переопределяют свойства, определенные в нижних местоположениях).
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
Вопрос: при запуске war
файл на tomcat
сервер: как я могу добавить дополнительное местоположение для application.properties
вне classpath или контейнера tomcat, как d:\application.properties
?
Пользовательское местоположение должно иметь наивысший приоритет в отношении указанных выше мест.
Проблема в том, что я могу, конечно, добавить /config
папка внутри моей взорвавшейся войны в кота webapps
папку, но тогда я потерял бы любую пользовательскую конфигурацию, если папка webapps очищена и война развернута заново.
Таким образом, я хотел бы добавить дополнительное местоположение снаружи.
4 ответа
Для меня самый простой способ сделать это - поместить файл контекста в папку конфигурации Tomcat. Например, если ваше приложение работает по корневому пути (например, http://your_domain.com/
) вам нужно создать файл [path_to_your_tomcat]/conf/Catalina/localhost/ROOT.xml
, Если ваше приложение работает по другому пути, например http://your_domain.com/example_path
файл должен быть назван так [path_to_your_tomcat]/conf/Catalina/localhost/example_path.xml
, Внутри этого файла вы можете указать путь к внешнему файлу application.properties, который можно разместить в любом месте на вашем жестком диске.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="java.lang.String"/>
</Context>
Вы можете установить spring_config_location
Переменная окружения, указывающая на папку, в которой находится файл application.properties.
В случае Tomcat вы можете сделать это, добавив следующую строку в ваш <TOMCAT_HOME>/bin/setenv.sh
файл (создайте файл, если он отсутствует):
export spring_config_location=/usr/local/tomcat/conf/
Поместите файл свойств в эту папку. Если у вас есть несколько приложений, вы можете установить имя файла свойств каждого приложения как уникальное. Для приложения Spring Boot я сделал это так:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.config.name", "my-app");
SpringApplication.run(MyApplication.class, args);
}
}
Это выберет новое имя при запуске с BOOT. Чтобы настроить имя при развертывании на Tomcat, перезаписать конфигурацию SpringBootServletInitializer
вот так:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class).properties("spring.config.name: my-app");
}
}
Затем назовите свой файл свойств как: my-app.properties
, Вместо имени по умолчанию Spring будет искать это. Вы можете поместить все файлы свойств ваших приложений в указанную папку, /usr/local/tomcat/conf/
в нашем образце. Ваши внешние свойства получат приоритет. Смотрите приоритеты здесь: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
В tomcat/bin создайте файл setenv.sh, а в файле вам нужно указать следующую строку в файле для свойств по умолчанию для всех войн, сохранить его и перезапустить tomcat.
export SPRING_PROFILES_ACTIVE=dev
Мне пришлось сделать это несколько раз, и лучший подход, который я нашел, это настроить внешний каталог как ресурс classpath в контейнере:
Затем в каталоге разместите ресурсы, которые вы хотите использовать, и все будет работать нормально. Чтобы загрузить ресурс весной, вы можете сделать это так:
<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
<beans:property name="placeholderPrefix" value="!applicationProperties{" />
<beans:property name="placeholderSuffix" value="}" />
</beans:bean>
Вы можете видеть, что, как вы сказали, что вам может потребоваться развернуть несколько приложений в каждом tomcat, вы можете просто создать структуру каталогов в папке, которую вы указали в classpath, чтобы поддерживать разные application.properties
для каждого из ваших war
Приложения
Если вы хотите динамически поддерживать раздел имени приложения в конфигурации Spring, вы можете сделать это несколькими способами, на этапе упаковки в maven или даже используя путь к контексту приложения.
Использование Tomcat 9.0.27
Запуск Spring boot 2.2.1
Я сделал настройку setenv.sh
и добавил строку
export spring_config_location=/<PATH_TO_CONF_DIR>/application.properties
и заставил работать..
Наконец, я добавил следующее свойство для экстернализации, например, защищенные свойства:
spring.config.additional-location=/etc/tomcat/<appname>/application-production.properties
Для Tomcat 9 в Ubuntu 18.04 и весенней загрузки 2 создайте файл setenv.sh в каталоге $CATALINA_HOME/bin/, работающий для меня:
#!/bin/bash
export spring_config_additional_location="/opt/tomcat/latest/conf/application.properties"
не забудьте установить разрешение файла при необходимости
Если кто-то ищет решение Linux, это работает для нас:
редактировать tomcat startup.sh
Добавлять:
export spring_config_location=/<YOUR_PATH>/application.properties
пример:
export spring_config_location=/app/conf/application.properties