有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring启动可执行jar和外部配置文件

我有一个使用第三方jar的Spring启动应用程序。此jar需要一个xml配置文件,该文件必须由客户端在运行时(单独)提供,并且不能预打包。第三方库使用以下顺序加载该文件(我去掉了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的自动连接开始失败:配置目录中的附加application.properties文件覆盖了一些设置,使用上述命令会导致应用程序启动失败:

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}")注释,属性在JAR中绑定的application.properties文件中定义,当config dir中不存在其他application.properties时,值注入工作正常

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    move ./config/application.properties to ./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

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

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

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

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

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

    并将./config/application.propertie移动到/config/config/application。“财产”变成:

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

    两者顺序相同,没有歧义