Подтвердить что ты не робот

Как экстернализировать 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#boot-features-external-config-application-property-files

Вопрос: при запуске файла war на сервере tomcat: как добавить дополнительное место для application.properties вне класса или контейнера tomcat, например d:\application.properties

Пользовательское местоположение должно иметь наивысший приоритет в отношении местоположений выше.

Проблема заключается в следующем: я мог бы, конечно, добавить папку /config внутри моей взорванной войны в папку tomcat webapps, но тогда я потеряю любую настраиваемую конфигурацию, если папка webapps будет очищена, а война будет перераспределена.

Таким образом, я хотел бы добавить дополнительное место снаружи.

4b9b3361

Ответ 1

Вы можете установить spring_config_location среды 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

ОБНОВИТЬ

Начиная с Spring Boot 2 поведение spring_config_location изменилось (из руководства по миграции):

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

Поэтому, исходя из вашего варианта использования, вы должны рассмотреть, какие из свойств установить в качестве переменной среды. Новый должен выглядеть как spring_config_additional-location в setenv.sh. Где искать файлы, также описано в справочной документации.

Ответ 2

Для меня самый простой способ сделать это - разместить контекстный файл внутри папки конфигурации 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>

Ответ 3

Мне приходилось делать это несколько раз, и лучший подход, который я нашел, - настроить внешний каталог как ресурс пути к классам в контейнере:

Путь к классу Tomcat

Затем в каталоге разместите ресурсы, которые вы хотите выделить, и все будет работать нормально. Чтобы загрузить ресурс в spring, вы можете сделать так:

<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, вы можете просто создать структуру каталогов в папке, установленной в пути к классам, для поддержки различных application.properties для каждого из ваших war приложения

введите описание изображения здесь

Если вы хотите динамически поддерживать раздел имени приложения в конфигурации Spring, вы можете сделать это несколькими способами во время этапа упаковки в maven или даже с использованием пути контекста приложения

Ответ 4

Наконец, я добавил следующее свойство для экстернализации, например, защищенные свойства:

spring.config.additional-location=/etc/tomcat/<appname>/application-production.properties

Ответ 5

Если кто-то ищет решение Linux, это работает для нас:
редактировать tomcat startup.sh
добавлять:

 export spring_config_location=/<YOUR_PATH>/application.properties

пример:

 export spring_config_location=/app/conf/application.properties

Ответ 6

для Tomcat 9 в Ubuntu 18.04 и весенней загрузки 2 создайте файл setenv.sh в каталоге $ CATALINA_HOME/bin/, работающий для меня:

#!/bin/bash

export spring_config_additional_location="/opt/tomcat/latest/conf/application.properties"

не забудьте установить разрешение файла при необходимости