我有一个使用第三方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。