0

当我通过命令行运行 jar 时,我想将SpringBoot外部的一些配置覆盖到类路径文件中。

类路径 -> 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,contextPath 是“myapp”。我的预期是 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,contextPath 是“yourapp”。

如何将 SpringBoot 外部的一些配置覆盖到类路径文件中?我正在使用 2.5.4。

我不想将一些不必要的配置导出到外部。我想按顺序排列和覆盖。

4

3 回答 3

1

尝试提供两者spring.config.additional-locationspring.config.name像这样,

-Dspring.config.additional-location=D:///test/ -Dspring.config.name=application-config,application-config-override
于 2021-09-05T18:21:45.593 回答
1

在 Windows 中,

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

上面的命令将解决您的需求。在 Spring 版本 2.5.4 上测试

在此处输入图像描述

于 2021-09-06T07:42:27.330 回答
0

既然您使用的是 SpringBoot,为什么不使用 SpringBoot 命名约定?如果为文件命名,application.yaml则不必运行 jar 指定配置文件的位置,因为 SpringBoot 会自动加载它们(如果它们位于默认位置)。

而不是application-config.yamlapplication-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

INFO 6604 --- [main] com.example.demo.DemoApplication
:在 1.611 秒内启动 DemoApplication(JVM 运行 2.118) Value1:内部 Value2:内部

然后我将一个外部 application.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 INFO 23540 --- [main] com.example.demo.DemoApplication:在 1.552 秒内启动 DemoApplication(JVM 为 2.101 运行) Value1:外部 Value2:内部

所以你可以看到外部value1覆盖了内部value1

这些配置文件以特定的顺序和优先级加载。来自SpringBoot 文档

配置数据文件按以下顺序考虑:

  • 打包在 jar 中的应用程序属性
  • 打包在 jar 中的特定于配置文件的应用程序属性
  • 打包 jar 之外的应用程序属性
  • 打包 jar 之外的特定于配置文件的应用程序属性
于 2021-09-05T16:41:50.380 回答