当前位置: 首页 > 知识库问答 >
问题:

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

万高轩
2023-03-14

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

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

我不能更改lib加载文件的方式(例如使用Spring的资源加载),所以它必须在类路径上。因此,我似乎失去了像java-jarmy-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}”)注释,属性在application.properties文件中定义,绑定在JAR中,当配置目录中不存在其他application.properties时,值注入工作正常。

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

应用程序是打包使用Spring引导maven插件和使用Spring引导启动父父POM。

共有1个答案

南宫喜
2023-03-14

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

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

如果存在多个同名的类路径资源,Spring Boot将只加载其中一个,在您的情况下,Spring Boot将加载属性资源并按如下顺序排列优先级:

  1. 文件:config/application.properties

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

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

  1. file: config/
  2. file:
  3. 类路径:配置
  4. 类路径

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

  1. 文件:config/application.properties

./config/application.propertie移动到./config/config/application.properties将变成:

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

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

 类似资料:
  • 我有一个罐子x,它有一个类 现在在一个完全不同的项目中,我添加了这个jar作为依赖项。 并导入这个类,如: } 基本上,我在项目中使用了jar的Spring配置文件。 但当我运行我的应用程序时,我会出现以下错误: 信息:java。伊奥。FileNotFoundException:无法打开类路径资源[WEB-INF/assembly/appconfig.xml],因为它不存在。springframe

  • 我有一个标准的Spring靴项目。 我有一个/src/main/resources文件夹,其中有几个配置文件。 我怎样才能用Gradle做到这一点呢?

  • 问题内容: 我一直在尝试将jar转换为exe。该程序-jar-使用蓝牙库“ Bluecove”,它是某个目录中的另一个jar。该程序还通常使用Java Swing 和东西。从Netbeans或Eclipse中运行时,该程序可以完美运行。现在是我部署它的时候了,因此我需要将其转换为exe。但是我一直无法获得最终的可执行文件来链接“ Bluecove”。我尝试了JSmooth和Launch4j,但是使

  • 问题内容: 我想做一些我认为并不困难的事情。 我有一个要打包为jar的应用程序,因为我有大约30个依赖项,并且我希望能够部署一个文件。 我有一些配置文件-一个属性文件和一个spring配置文件,以及我的log4 props文件- 我想在jar外部使用。我想我希望,如果我将它们与jar放在同一目录中,它将在运行时找到它们,但事实并非如此。 在开发过程中,我将这些文件放在eclipse项目的类路径的根

  • 我将应用程序打包为spring-boot可执行jar文件。我在jar文件的根目录中添加了一个logging.properties,但这个文件似乎对应用程序没有任何影响。如何配置spring-boot可执行jar日志记录?