问题概述:
使用 Spring Boot-2.0.3 进行项目开发,在配置 Druid 数据监控时,遇到缺包的问题,测试连接操作时报错,导致测试一直无法通过,部分信息如下:
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Priority
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.alibaba.druid.util.Utils.loadClass(Utils.java:203)
at com.alibaba.druid.filter.FilterManager.loadFilter(FilterManager.java:104)
at com.alibaba.druid.pool.DruidAbstractDataSource.addFilters(DruidAbstractDataSource.java:1286)
at com.alibaba.druid.pool.DruidAbstractDataSource.setFilters(DruidAbstractDataSource.java:1275)
... 113 more
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 119 more
解决办法:
有同事告诉我,因为使用的 Spring Boot 为最新稳定版本,所以不排除包的版本过低导致,所以全部的包都按照官网最新兼容包进行导入;
所以首先,确认导入 Druid 包相对于当前为最新的版本,如下图:
pom.xml 中引入添加的配置,
com.alibaba
druid
1.1.10
可是最后呢,还是出现同样的错误!!!
最后没办法,只得缺那个包就到那个包呗,导入官网最新兼容包,如下图:
pom.xml 中引入添加的配置,
log4j
log4j
1.2.17
在项目的 resources 目录下,新建一个 log4j.properties 参数配置文件,并键入如下内容:
### set log levels ###
log4j.rootLogger = INFO,DEBUG, console, infoFile, errorFile ,debugfile,mail
LocationInfo=true
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n
log4j.appender.infoFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.infoFile.Threshold = INFO
log4j.appender.infoFile.File = D:/logs/log
log4j.appender.infoFile.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.infoFile.Append=true
log4j.appender.infoFile.layout = org.apache.log4j.PatternLayout
log4j.appender.infoFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n
log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorFile.Threshold = ERROR
log4j.appender.errorFile.File = D:/logs/error
log4j.appender.errorFile.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.errorFile.Append=true
log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n
#log4j.appender.debugfile = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.debugfile.Threshold = DEBUG
#log4j.appender.debugfile.File = D:/logs/debug
#log4j.appender.debugfile.DatePattern = '.'yyyy-MM-dd'.log'
#log4j.appender.debugfile.Append=true
#log4j.appender.debugfile.layout = org.apache.log4j.PatternLayout
#log4j.appender.debugfile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n
这样项目就可以正常的启动并进行下一步开发了,缺 org.apache.log4j.Priority 包的问题就解决了,但是导致这个问题的不应该呀,它们应该整合的时候已经配置在里面的了呃,所以这个问题还得进一步的研究一下,如果有知道因果的,望不吝赐教,共同学习,共同进步!!!
日志记录:
2019-01-18 上午 10点
感谢评论区那位老弟的热心评论,比较有道理,博主就基于目前最新的Spring Boot 立即去查看了其当前的组织架构,和源码,证实一下,但具体的为社么Spring Boot 会摒弃 log4j-over-slf4j 而使用 log4j-to-slf4j,博主就不妄加评论了,可能是人家另有原因呢,所以在这儿再追加叙述哈,
有兴趣的可以自己去研究研究:
在新版的 Spring Boot 中获取到 Logger 对象稍有不同,在以前使用slf4j的时,使用LoggerFactory去获取,而现在只使用log4j2的话,一般是使用LogManager去获取的。(后面有时间再作详细的讲解),示例代码如下:
package com.cdp.common.log;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class LogsUtils{
private static final Logger LOGGER = LogManager.getLogger();
public static void main(String... args) {
String result = args.length > 0 ? args[0] : "world";
LOGGER.info("Hello, {}!", result);
LOGGER.debug("Got calculated value only if debug enabled: {}", () -> doSomeCalculation());
}
private static Object doSomeCalculation() {
// do some complicated calculation
}
}
好了,关于Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。