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

时间:2015-12-29 08:54:37

标签: java spring spring-boot

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

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

我无法改变lib加载文件的方式(例如使用Spring的资源加载),所以它必须在classpath上。因此,我似乎失去了像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的自动装配开始失败:config目录中的其他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文件中定义,并且当config dir中不存在其他application.properties时,值注入工作正常

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

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

1 个答案:

答案 0 :(得分: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!/applcation.properties./config/application.properties
  3. 如果您的classLoader选择./config/application.properties作为第二个属性来源。砰!

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

    1. file:config/
    2. file:
    3. classpath:config/
    4. classpath
    5. 普通的可执行jar执行使这两个配置属性落入:

      1. file:config/application.properties
      2. classpath:application.properties(来自jar)
      3. ./config/application.propertie移动到'./config/config/application.properties'变为:

        1. classpath:config/application.properties
        2. classpath:application.properties(来自jar)
        3. 两者的顺序相同且没有歧义。