首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring引导可执行jar和外部配置文件

Spring引导可执行jar和外部配置文件
EN

Stack Overflow用户
提问于 2015-12-29 08:54:37
回答 1查看 3.2K关注 0票数 3

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

代码语言:javascript
复制
    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

我的目录结构如下:

代码语言:javascript
复制
|-- config
|   |-- application.properties
|   `-- 3rd-party-config.xml
|-- my-spring-boot-app.jar

但随后Spring的自动装配开始失败:配置目录中的附加application.properties文件覆盖了一些设置,使用上面的命令导致应用程序启动失败:

创建名为“ORBConfig”的bean错误:注入自动配置的依赖项失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动更新字段:私有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文件中定义,当配置dir中没有其他application.properties时,值注入工作良好。

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-07-22 16:03:17

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

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

如果存在多个同名类路径资源,Spring将只加载其中一个类路径资源,在您的示例中,Spring和优先排序属性资源如下:

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

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

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

  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.properties‘变成:

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

都是按相同的顺序排列,没有歧义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34507660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档