关于SpringBoot项目的jar包使用命令执行无法读取到外部logback配置文件的问题解决
如题。
在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文件了
更多推荐

所有评论(0)