SLF4J日志无法生成:JUnit平台控制台运行Jar时遇类加载错误
解决SLF4J打包Jar后与JUnit平台控制台运行时的StaticLoggerBinder加载失败问题
这个问题其实挺常见的,核心原因就是你的打包Jar里没包含SLF4J的绑定实现,再加上原来的依赖范围设置有坑,具体来说:
为什么本地正常、打包就出错?
你用的testCompile依赖范围,只会在IDE的测试编译、本地测试运行阶段生效。当你打包普通Jar时,Gradle不会把slf4j-jdk14这个绑定实现包含进去。而本地运行时IDEA会自动把testCompile的依赖加到类路径里,所以能找到StaticLoggerBinder类,但打包后单独运行就找不到了。
解决方案
这里有几种可行的办法,你可以根据需求选:
1. 调整依赖范围,让打包时包含绑定实现
把testCompile改成implementation(Gradle 4.0+推荐)或者compile(旧版Gradle),这样Gradle会把slf4j-jdk14作为项目核心依赖,后续打包时能被正确包含。修改后的依赖配置:
implementation group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.30'
2. 构建包含所有依赖的胖Jar
默认的jar任务只会打包你自己的代码,不会带第三方依赖。你可以用Gradle的Shadow插件构建胖Jar,把所有依赖(包括SLF4J绑定)都打包进去:
- 先在
build.gradle里添加Shadow插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' }
- 执行
./gradlew shadowJar命令,生成的胖Jar会在build/libs目录下,名字一般是你的项目名-all.jar - 用这个胖Jar和JUnit平台Jar一起运行,就不会出现类找不到的问题了
3. 运行时手动把SLF4J绑定Jar加到类路径
如果不想改依赖或构建胖Jar,可以在运行命令里把slf4j-jdk14-1.7.30.jar也加入类路径:
Windows系统:
java -cp "your-app.jar;junit-platform-console-standalone-1.5.2.jar;slf4j-jdk14-1.7.30.jar" org.junit.platform.console.ConsoleLauncher [你的测试参数]
Linux/macOS系统:
java -cp "your-app.jar:junit-platform-console-standalone-1.5.2.jar:slf4j-jdk14-1.7.30.jar" org.junit.platform.console.ConsoleLauncher [你的测试参数]
选其中一种方法应该就能解决问题了,推荐第一种+第二种组合,这样打包后的Jar可以独立运行,不用额外加依赖。
内容的提问来源于stack exchange,提问作者Hardik Rana
相关产品推荐
相关产品推荐

