gpt4 book ai didi

java - Spring Boot可执行jar和外部配置文件

转载 作者:行者123 更新时间:2023-12-02 06:09:18 26 4
gpt4 key购买 nike

我有一个使用第 3 方 jar 的 Spring Boot 应用程序。该 jar 需要一个 xml 配置文件,该文件必须由客户端在运行时(单独)提供,并且不能预先打包。第 3 方库使用以下序列加载该文件(我删除了 if 和空检查):

    FileConfigurator.class.getResource("/" + filename);
Thread.currentThread().getContextClassLoader().getResource("/" + filename);
Thread.currentThread().getContextClassLoader().getResource(filename);

我无法更改 lib 加载文件的方式(例如使用 Spring 的资源加载),因此它必须位于类路径上。因此我似乎失去了执行它的可能性,如 java -jar my-spring-boot-app.jar ,因为-jar选项阻止添加任何其他类路径条目。所以我开始像

一样运行它

java -classpath my-spring-boot-app.jar:./config/: org.springframework.boot.loader.JarLauncher

我的目录结构如下:

|-- config
| |-- application.properties
| `-- 3rd-party-config.xml
|-- my-spring-boot-app.jar

但是 Spring 的 Autowiring 开始失败:Additional application.properties config 目录中的文件覆盖了一些设置,并且使用上述命令会导致应用程序启动失败:

Error creating bean with name 'ORBConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.company.app.communication.corba.orb.ORBConfig.serverName; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'application.corba.serverName' in string value "${application.corba.serverName}"

字段String serverName注释为 @Value("${application.corba.serverName}") ,该属性在 application.properties 中定义当附加 application.properties 时,JAR 中捆绑的文件和值注入(inject)可以正常工作。不存在于配置目录中。

我的实际问题是:部署和/或运行 Spring Boot 应用程序的明智方法是什么,以利用可执行 Jar 功能,在运行时提供额外的类路径资源,并且仍然能够覆盖一些(但不是全部)属性通过类路径application.properties文件?

应用程序使用spring boot maven插件打包并使用spring-boot-starter-parent父 POM。

最佳答案

如果您不更改启动命令,一个简单的答案:

move ./config/application.properties to ./config/config/application.properties

如果存在多个同名的类路径资源,Spring Boot 将仅加载其中之一,在这种情况下,Spring Boot 会加载属性资源并按以下优先级排序:

  1. 文件:config/application.properties
  2. classpath:application.properties 可能解析为 my-spring-boot-app.jar!/applcation.properties./config/application .properties

如果您的类加载器选择 ./config/application.properties 作为第二个属性源。砰!

Spring Boot的默认配置属性资源路径优先级(从最高到最低优先级)是:

  1. 文件:配置/
  2. 文件:
  3. 类路径:config/
  4. 类路径

普通的可执行jar执行使这两个配置属性落入:

  1. 文件:config/application.properties
  2. classpath:application.properties(来自 jar)

./config/application.properties 移动到“./config/config/application.properties”变为:

  1. 类路径:config/application.properties
  2. classpath:application.properties(来自 jar)

两者顺序相同,没有歧义。

关于java - Spring Boot可执行jar和外部配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34507660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com