Как экспортировать 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 в контейнере:

Tomcat 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
Другие вопросы по тегам