#java #spring #spring-boot #spring-boot-configuration
Вопрос:
Я хотел бы переопределить SpringBoot
внешнюю конфигурацию в файле пути к классу., когда я запускаю jar с помощью командной строки.
путь к классу -> application-config.yaml (Не application.yaml)
server:
port: 8080
servlet:
contextPath: /myapp
test-message: this config no need to export as external config.
внешний -> D:/test/application-config-override.yaml
server:
port: 9090
команда
java -Dspring.config.location=classpath:application-config.yaml,file:///D:/test/application-config-override.yaml -jar myapp.jar
когда я запускаю выше, приложение работает под управлением 8080, контекстный путь — «мое приложение». Мое ожидаемое-это http://localhost:9090/myapp
Но, если я помещу все ту же структуру конфигурации application-config.yaml
в application-config-override.yaml
, как показано ниже
приложение-конфигурация-переопределение.yaml
server:
port: 9090
servlet:
contextPath: /yourapp
test-message: this config no need to export as external
Приложение запущено 9090, контекстный путь — «yourapp».
Как переопределить внешнюю конфигурацию SpringBoot в файле пути к классу? Я использую 2.5.4.
Я не хочу экспортировать ненужные некоторые конфигурации во внешние. Я хотел бы мардж и отменить приказ.
Комментарии:
1. Можно ли изменить имена файлов yml?
2. @ray Это можно изменить. Но. Это будет больше рабочей нагрузки для изменения для всего проекта всего конвейера CICD . У нас более ста микросервисов. Он отлично работает в версии 2.1.x
3. 2.4.0 работает
4. Вы пробовали мой ответ?
Ответ №1:
Постарайтесь предоставить и spring.config.additional-location
то, и другое, и spring.config.name
вот так,
-Dspring.config.additional-location=D:///test/ -Dspring.config.name=application-config,application-config-override
Ответ №2:
В Окнах,
java -jar demo.jar --spring.config.additional-location=file:///C:/Data/demo/application-config-override.yaml --spring.config.name=application-config,application-config-override
В linux,
java -jar demo.jar --spring.config.additional-location=file:/home/user/config/application-config-override.yaml --spring.config.location=classpath:application-config.yaml
Приведенная выше команда решит вашу проблему. Протестировано на весенней версии 2.5.4
Ответ №3:
Поскольку вы используете SpringBoot, почему вы не используете соглашения об именах SpringBoot? Если вы назовете файлы application.yaml
, вам не придется запускать jar с указанием расположения ваших файлов конфигурации, так как SpringBoot автоматически загрузит их (если они находятся в расположении по умолчанию).
Вместо application-config.yaml
и application-config-override.yaml
назовите как внутренние, так и внешние файлы application.yaml
.
Далее, если вы разместите файл yaml за пределами jar, он автоматически будет считан SpringBoot и сделает то, чего вы пытаетесь достичь.
Вот тест, который я провел:
внутренний application.yaml
файл:
value1: "internal"
value2: "internal"
затем в приложении:
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Value("${value1}")
String val1;
@Value("${value2}")
String val2;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Value1: " val1 "n" "Value2: " val2);
}
}
Затем, когда я запускаю это без внешней конфигурации:
java -jar demo-0.0.1-SNAPSHOT.jar
ИНФОРМАЦИЯ 6604 — [ главная] com.пример.демонстрация.Демонстрационное
приложение : Запущено демонстрационное приложение за 1.611 секунд (JVM работает в течение 2.118) Значение 1: внутреннее значение 2: внутреннее
Затем я размещаю внешнее приложение.yaml в том же каталоге, что и jar:
demo-0.0.1-SNAPSHOT.jar
application.yaml
Имеющие ценность:
value1: "external"
Тогда выход будет:
java -jar demo-0.0.1-SNAPSHOT.jar
2021-09-05 11:22:31.211 ИНФОРМАЦИЯ 23540 — [ главная] com.пример.демонстрация.Демонстрационное приложение : Запущено демонстрационное приложение за 1,552 секунды (JVM работает для 2.101) Значение 1: внешнее значение 2: внутреннее
Таким образом, вы можете видеть, что внешнее value1
переопределяет внутреннее value1
Эти файлы конфигурации загружаются в определенном порядке и с определенным приоритетом. Из документов SpringBoot:
Файлы данных конфигурации рассматриваются в следующем порядке:
- Свойства приложения, упакованные в вашу банку
- Свойства приложения для конкретного профиля, упакованные в вашу банку
- Свойства применения вне вашей упакованной банки
- Свойства приложения, зависящие от профиля, за пределами вашей упакованной банки
Комментарии:
1. Спасибо за ваш ответ. Он работает в версии 2.1.x. Это трудно изменить для всего проекта. У нас более ста микросервисов.