Как переопределить внешний файл конфигурации SpringBoot в файл пути к классам?

#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. Это трудно изменить для всего проекта. У нас более ста микросервисов.