Внешняя конфигурация для приложения 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