Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法


问题概述:

使用 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

截图如下:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第1张图片


解决办法:

有同事告诉我,因为使用的 Spring Boot 为最新稳定版本,所以不排除包的版本过低导致,所以全部的包都按照官网最新兼容包进行导入;
所以首先,确认导入 Druid 包相对于当前为最新的版本,如下图:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第2张图片

pom.xml 中引入添加的配置,

        
            com.alibaba
            druid
            1.1.10
        

如下图:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第3张图片

可是最后呢,还是出现同样的错误!!!
最后没办法,只得缺那个包就到那个包呗,导入官网最新兼容包,如下图:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第4张图片

pom.xml 中引入添加的配置,

        
            log4j
            log4j
            1.2.17
        

如下图:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第5张图片

在项目的 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,博主就不妄加评论了,可能是人家另有原因呢,所以在这儿再追加叙述哈,
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第6张图片
有兴趣的可以自己去研究研究:
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority 的解决办法_第7张图片
在新版的 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社区。

你可能感兴趣的:(Java,Spring,Boot)