关于SpringBoot项目的jar包使用命令执行无法读取到外部logback配置文件的问题解决

文章讲述了在SpringBoot项目中,当配置logback日志系统并尝试从外部config文件夹读取logback-spring.xml时,配置不生效的问题。提出了两种解决方案:一是通过修改logging.config配置指定外部文件的完整路径;二是利用Java命令的-Xbootclasspath/a选项扩展类加载路径,使Spring能识别到外部配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题。
在SpringBoot配置了logback管理日志,application.yml配置的logback配置文件相关如下:

logging:
    config: classpath:logback-spring.xml

将项目打成jar包,在jar包同级目录下创建config文件夹,并复制了resources文件夹下的配置文件(包括logback-spring.xml文件)到config文件夹下。
目录结构如下图所示:
jar包所在目录
在这里插入图片描述
config文件夹内容
在这里插入图片描述
使用java -jar bak-jar.jar执行jar包,发现修改外部config文件夹里面的log-back.xml配置不生效,仍然在读取jar包内部的log-back.xml,排查后发现,logging.config配置的是classpath:log-back.xml。

这个问题有两种解决方案

第一种解决方案:

指定正确的外部的logback-spring.xml文件的位置

修改外部配置文件的logback配置为如下:

logging:
    config: ./config/logback-spring.xml

即:

logging:
#  config: ./config/logback-spring.xml  #部署的时候的配置
  config: classpath:logback-spring.xml  #开发调试运行时的配置

第二种解决方案:

把执行 java -jar bak-jar.jar命令更换为:

java -jar -Xbootclasspath/a:jar包所在文件夹/config bak-jar.jar

第二种方案的解释:

Java类加载器的层次结构是BootstrapLoader --> ExtensionLoader --> ApplicationLoader
通过org.springframework.util.ResourceUtils.getURL("classpath:").getPath(); 可以获取到Spring - Java加载类的路径,也就是说,我们在配置文件中所配置的classpath:h:logback-spring.xml可以视为读取类加载的路径位置的:logback-spring.xml文件,当打成jar包的时候,读取的路径为file/:jar包所在目录/bak-jar.jar!/BOOT-INF/classes!/,也就是说只会读取jar包内部的logback-spring.xml文件。

Java 命令行提供了如何扩展 BootStrap 加载器级别 class 的简单方法,如下:

-Xbootclasspath: 完全取代基本核心的Java class 搜索路径。不常用,否则要重新写所有Java核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面。常用
-Xbootclasspath/p: 前缀在核心class搜索路径前面。不常用,避免引起不必要的冲突。

语法如下:

多个路径之间 unix使用:号间隔,windows使用;号间隔。

java -jar -Xbootclasspath/a:jar包所在文件夹/config bak-jar.jar的语义为,除了原有的classpath:的路径以外,再额外扩展路径jar包所在文件夹/config作为Spring加载资源文件路径,那么只要符合扩展的文件路径,都会被作为资源文件找到。

这样就可以成功加载到我们外部配置的log-back.xml文件了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千早爱音Official

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值