Внешняя конфигурация для приложения spring -boot

У меня есть приложение spring -boot, которое я хочу запустить с внешним файлом конфигурации. Когда я запускаю его как банку (со встроенным контейнером сервлета), все в порядке. Но я хочу запустить его под внешним контейнером сервлетов (Tomcat), и здесь у меня проблема с внешней конфигурацией. Я попробовал @PropertySource, но в этом случае приложение получает только свойства, отсутствующие в конфигурации военного файла: внешняя конфигурация не переопределяет внутреннюю конфигурацию. Итак, вопрос: как настроить внешнюю конфигурацию, которая переопределит внутреннюю конфигурацию?

Ответы

Ответ 1

Вероятно, вы используете внешнюю конфигурацию в форме application.properties в текущем каталоге, когда вы запускаете приложение как банку. Однако "текущий каталог" не очень полезен при развертывании в качестве войны во внешнем коте. Даже если вы узнаете, что такое текущий каталог, это, скорее всего, одно и то же место для всех приложений, работающих в этом tomcat, поэтому, когда вы запускаете несколько приложений, это не будет работать очень хорошо.

Что мы здесь делаем, это объявить два PropertySources в нашем приложении:

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})

internal.properties содержит "встроенные" значения по умолчанию для пропозиций. Второй PropertySource - это файл, содержащий внешнюю конфигурацию. Обратите внимание, как имя файла является свойством.

Мы определяем это извне в элементе Context нашего приложения (в tomcat):

<Context docBase="/path/to/your/war/your.war">
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>

Это позволяет вам иметь несколько приложений, работающих в tomcat, причем каждое приложение использует собственный файл внешних свойств. Вы даже можете иметь несколько экземпляров одного и того же приложения, работающих с разными свойствами.

Ответ 2

Для экстернализации > boot.properties при развертывании в качестве военного файла вы можете установить spring.config.location в начале, когда настроено Spring приложение загрузки:

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }

Подробнее см. в этом .

Ответ 3

Spring Загрузите предложение много способов, чтобы указать местоположение ваших свойств, не нужно изменять ваши источники.

Yo может определить значение spring.config.location, например:

  • В дескрипторах контекста tomcat/conf/Catalina/<host>:

    <Context>
        <Parameter name="spring.config.location" value="/path/to/application.properties" />
    </Context>
    
  • Как параметр JVM в файле tomcat setenv.sh:

    -Dspring.config.location=/path/to/application.properties
    
  • Как переменная среды SPRING_CONFIG_LOCATION.

Ответ 4

Вы можете добавить папку с файлами конфигурации, чтобы установить строку Classpath catalina.bat, catalina.sh (какую, если вы хотите использовать.) Или вы можете добавить в файл setenv.bat/sh. Ваши конфигурационные файлы будут добавлены в war classpath.

Например;

В Windows env.

set CLASSPATH=D:\app\conf