it-roy-ru.com

Как экспортировать 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 будет очищена и война развернута заново.

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

12
membersound

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

9
Vladimir Mitev

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

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

 enter image description here

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

1
jlumietu

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

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

0
membersound