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

3

我有一个使用第三方jar的Spring Boot应用程序。这个jar需要一个xml配置文件,在运行时必须由客户端提供(单独提供),不能预先打包。第三方库使用以下顺序加载该文件(我剥离了if和null-checks):

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

我无法更改lib加载文件的方式(例如使用Spring的Resource加载),因此它必须在类路径中。因此,似乎失去了像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的自动装配开始失效:配置目录中的附加application.properties文件覆盖了某些设置,使用上述命令导致应用启动失败:

创建名为“ORBConfig”的bean时出错:自动装载依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动注入字段:private java.lang.String com.company.app.communication.corba.orb.ORBConfig.serverName; 嵌套异常是java.lang.IllegalArgumentException: 无法在字符串值"${application.corba.serverName}"中解析占位符"application.corba.serverName"

字段String serverName带有注释@Value("${application.corba.serverName}"),属性在JAR中捆绑的application.properties文件中定义,当配置目录中不存在附加的application.properties文件时,值注入工作正常。
我实际的问题是:部署和/或运行Spring Boot应用程序的建议方法是什么,以利用可执行的Jar功能,在运行时提供额外的类路径资源,并仍然能够通过类路径application.properties文件覆盖一些(但不是全部)属性?
该应用程序使用spring boot maven插件打包,并使用spring-boot-starter-parent parent POM。
1个回答

0

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

./config/application.properties 移动到 ./config/config/application.properties

如果存在多个同名类路径资源,则 Spring Boot 只会加载其中一个。在您的情况下,Spring Boot 加载和优先处理属性资源如下:

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

如果您的 classLoader 选择了第二个属性源 ./config/application.properties。砰!

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

  1. file:config/
  2. file:
  3. classpath:config/
  4. classpath

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

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

./config/application.propertie移动到'./config/config/application.properties'变为:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接