如何将 SpringBoot 配置外部文件覆盖到类路径文件?
How to override SpringBoot config external file to classpath file?
我想将 SpringBoot
外部的某些配置覆盖到类路径文件中。当我通过命令行 运行 jar 时。
类路径 -> 应用程序-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
当我运行以上推荐时,应用是运行ning 8080,contextPath是“myapp”。我的预期是 http://localhost:9090/myapp
但是,如果我将 application-config.yaml
的所有 相同的配置结构 放入 application-config-override.yaml
中,如下所示
应用程序配置-override.yaml
server:
port: 9090
servlet:
contextPath: /yourapp
test-message: this config no need to export as external
应用程序是 运行ning 9090,contextPath 是“yourapp”。
如何将SpringBoot外部的一些配置覆盖到类路径文件中?我正在使用 2.5.4.
我不想将一些不必要的配置导出到外部。我想按顺序排列和覆盖。
既然你在使用 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
INFO 6604 --- [ main] com.example.demo.DemoApplication
: Started DemoApplication in 1.611 seconds (JVM running for 2.118)
Value1: internal Value2: internal
然后我将外部 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 : Started DemoApplication in
1.552 seconds (JVM running for 2.101)
Value1: external Value2: internal
所以你可以看到外部 value1
覆盖内部 value1
这些配置文件按特定的顺序和优先级加载。
来自 SpringBoot Docs:
Config data files are considered in the following order:
- Application properties packaged inside your jar
- Profile-specific application properties packaged inside your jar
- Application properties outside of your packaged jar
- Profile-specific application properties outside of your packaged jar
尝试像这样同时提供 spring.config.additional-location
和 spring.config.name
,
-Dspring.config.additional-location=D:///test/ -Dspring.config.name=application-config,application-config-override
在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
上测试
我想将 SpringBoot
外部的某些配置覆盖到类路径文件中。当我通过命令行 运行 jar 时。
类路径 -> 应用程序-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
当我运行以上推荐时,应用是运行ning 8080,contextPath是“myapp”。我的预期是 http://localhost:9090/myapp
但是,如果我将 application-config.yaml
的所有 相同的配置结构 放入 application-config-override.yaml
中,如下所示
应用程序配置-override.yaml
server:
port: 9090
servlet:
contextPath: /yourapp
test-message: this config no need to export as external
应用程序是 运行ning 9090,contextPath 是“yourapp”。
如何将SpringBoot外部的一些配置覆盖到类路径文件中?我正在使用 2.5.4.
我不想将一些不必要的配置导出到外部。我想按顺序排列和覆盖。
既然你在使用 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
INFO 6604 --- [ main] com.example.demo.DemoApplication
: Started DemoApplication in 1.611 seconds (JVM running for 2.118) Value1: internal Value2: internal
然后我将外部 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 : Started DemoApplication in 1.552 seconds (JVM running for 2.101) Value1: external Value2: internal
所以你可以看到外部 value1
覆盖内部 value1
这些配置文件按特定的顺序和优先级加载。 来自 SpringBoot Docs:
Config data files are considered in the following order:
- Application properties packaged inside your jar
- Profile-specific application properties packaged inside your jar
- Application properties outside of your packaged jar
- Profile-specific application properties outside of your packaged jar
尝试像这样同时提供 spring.config.additional-location
和 spring.config.name
,
-Dspring.config.additional-location=D:///test/ -Dspring.config.name=application-config,application-config-override
在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
上测试