Could not initialize class org.apache.log4j.LogManager 报错

本文介绍了一个在Windows环境下正常的项目部署到CentOS时出现的异常问题及解决方法。主要原因是log4j.properties文件中指定的日志路径在CentOS环境下不存在,通过调整路径配置解决了ExceptionInInitializerError异常。

部署项目的时候,在windows下一切正常,但是在centos下就发生如下错误

Caused by: java.lang.ExceptionInInitializerError
    at com.dsideal.sys.service.impl.SysMenuService.<init>(SysMenuService.java:60)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:96)
    ... 32 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'LoggingThrowsAdvice' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dsideal.framework.aop.LoggingThrowsAdvice]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:881)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:837)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.dsideal.framework.common.SpringUtil.<clinit>(SpringUtil.java:9)
    ... 38 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dsideal.framework.aop.LoggingThrowsAdvice]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:111)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:875)
    ... 54 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
    at org.apache.log4j.Logger.getLogger(Logger.java:85)
    at com.dsideal.framework.aop.LoggingThrowsAdvice.<init>(LoggingThrowsAdvice.java:12)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:96)
    ... 56 more

最终解决方法是:log4j.properties配置错误

windows下配置为:

#log4j.rootLogger=info,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=%5p [%t] - %m%n
#
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=c:/subject.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=0
log4j.appender.file.layout=org.apache.log4j.SimpleLayout
log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n
#
log4j.logger.com.ibatis=debug,ibatis
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug,ibatis
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug,ibatis
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug,ibatis
#
log4j.logger.java.sql.Connection=debug,ibatis
log4j.logger.java.sql.Statement=debug,ibatis
log4j.logger.java.sql.PreparedStatement=debug,stdout,ibatis
log4j.logger.java.lang.Exception=debug,ibatis
#
log4j.appender.ibatis=org.apache.log4j.RollingFileAppender
log4j.appender.ibatis.File=c:/ibatis.log
log4j.appender.ibatis.MaxFileSize=100KB
log4j.appender.ibatis.MaxBackupIndex=0
log4j.appender.ibatis.layout=org.apache.log4j.SimpleLayout
log4j.appender.ibatis.layout.ConversionPattern=[ssh] %p %t %c - %m%n

log4j.logger.com.opensymphony.xwork2=ERROR

而在centos中,没有c:/,这里一定要注意

#log4j.rootLogger=info,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=%5p [%t] - %m%n
#
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/usr/local/subject.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=0
log4j.appender.file.layout=org.apache.log4j.SimpleLayout
log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n
#
log4j.logger.com.ibatis=debug,ibatis
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug,ibatis
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug,ibatis
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug,ibatis
#
log4j.logger.java.sql.Connection=debug,ibatis
log4j.logger.java.sql.Statement=debug,ibatis
log4j.logger.java.sql.PreparedStatement=debug,stdout,ibatis
log4j.logger.java.lang.Exception=debug,ibatis
#
log4j.appender.ibatis=org.apache.log4j.RollingFileAppender
log4j.appender.ibatis.File=/usr/local/ibatis.log
log4j.appender.ibatis.MaxFileSize=100KB
log4j.appender.ibatis.MaxBackupIndex=0
log4j.appender.ibatis.layout=org.apache.log4j.SimpleLayout
log4j.appender.ibatis.layout.ConversionPattern=[ssh] %p %t %c - %m%n

log4j.logger.com.opensymphony.xwork2=ERROR

 

转载于:https://www.cnblogs.com/cczhoufeng/p/3165751.html

<think>我们正在解决的是 `java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager` 错误。这个错误通常发生在 Log4j2 初始化失败时,可能的原因包括: 1. 类路径中存在冲突的日志库(如同时存在 log4j-slf4j-impl 和 log4j-to-slf4j) 2. Log4j2 核心库缺失(log4j-core) 3. 静态初始化块或静态变量初始化时发生异常 4. 版本不兼容问题 根据之前的问题,我们知道用户遇到了日志库冲突(log4j-slf4j-impl 和 log4j-to-slf4j 不能同时存在)。现在又出现了 LogManager 的 NoClassDefFoundError,这可能是由于冲突导致的初始化失败,或者缺少必要的依赖。 下面我们提供系统化的解决方案: ### 步骤1: 确认依赖冲突 使用 Maven 依赖树分析(或 Gradle)检查 log4j 相关依赖: ```bash mvn dependency:tree -Dincludes=org.apache.logging.log4j ``` 或 ```bash gradle dependencies --configuration runtimeClasspath | grep 'log4j' ``` 重点检查: - `log4j-core`(必须存在,Log4j2 核心) - `log4j-api`(通常会自动引入) - 排除冲突的桥接器:`log4j-to-slf4j`(将 Log4j2 API 调用桥接到 SLF4J)和 `log4j-slf4j-impl`(将 SLF4J 调用转发到 Log4j2)不能同时存在。 ### 步骤2: 解决依赖冲突 根据你的日志策略选择以下方案之一: #### 方案A: 使用 Log4j2 作为日志实现(推荐) 确保有 `log4j-core` 和 `log4j-api`,并移除 `log4j-to-slf4j`。 ```xml <dependencies> <!-- Log4j2 核心 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> <!-- 如果需要通过 SLF4J 使用 Log4j2,则添加此依赖(但注意不要和log4j-to-slf4j共存) --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.23.1</version> <exclusions> <!-- 确保排除 log4j-to-slf4j --> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> </exclusion> </exclusions> </dependency> <!-- 其他依赖... --> </dependencies> ``` 同时,检查并排除其他依赖引入的 `log4j-to-slf4j`: ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>X.Y.Z</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> </exclusion> </exclusions> </dependency> ``` #### 方案B: 使用 SLF4J + Logback(移除 Log4j2) 如果你希望使用 Logback 作为日志实现,则移除所有 Log4j2 的依赖,并添加 Logback: ```xml <dependencies> <!-- Logback 实现 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.14</version> </dependency> <!-- 移除所有 Log4j2 相关依赖 --> <!-- 排除其他依赖中的 log4j --> <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>X.Y.Z</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ``` ### 步骤3: 检查静态初始化错误 如果依赖冲突已经解决,但仍然出现 `NoClassDefFoundError`,则可能是 `LogManager` 类在静态初始化时失败。检查是否有自定义的 `Log4j2` 配置文件(如 `log4j2.xml`)存在错误,或者环境问题(如缺少必要的系统属性)。 可以尝试以下方法: 1. 使用最简单的配置文件(或移除配置文件,使用默认配置)启动,看是否问题依旧。 2. 检查是否有多个版本的 `log4j-core` 或 `log4j-api` 存在,导致类加载混乱。 ### 步骤4: 验证日志实现 编写一个简单的测试类,在应用启动前运行: ```java public class Log4jTest { public static void main(String[] args) { System.out.println("Attempt to initialize Log4j2..."); org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class); logger.info("Hello Log4j2"); } } ``` 如果运行成功,则说明 Log4j2 可以正常工作。 ### 步骤5: 类加载问题 在复杂的环境中(如应用服务器、OSGi容器等),类加载问题可能导致 `NoClassDefFoundError`。确保 Log4j2 的类由同一个类加载器加载。 ### 预防措施 1. **统一管理版本**:使用 Maven BOM 或 Gradle 的 platform 统一日志库版本。 2. **使用依赖分析工具**:定期检查依赖冲突。 3. **测试环境**:在多种环境下测试日志配置。 通过以上步骤,应该能解决 `java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager` 错误。 §§相关问题§§ 1. 如何解决 Java 中的 `NoClassDefFoundError` 错误? 2. 如何排查 Log4j2 的配置文件问题? 3. 在 Spring Boot 中如何排除默认的 Logback 并使用 Log4j2?</think>### 解决 `java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager` 的方法 此错误通常由 Log4j2 初始化失败引起,根本原因包括 **依赖冲突**、**类加载问题** 或 **静态初始化异常**。以下是系统化解决方案: --- ### 步骤1:检查核心依赖冲突(关键) #### Maven 项目检查 ```xml <!-- 必须存在的核心依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <!-- 缺失会导致初始化失败 --> <version>2.23.1</version> </dependency> <!-- 检查冲突依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 排除默认日志实现 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` > 使用命令验证依赖树: > `mvn dependency:tree -Dincludes=org.apache.logging.log4j` #### Gradle 项目检查 ```gradle configurations.all { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } dependencies { implementation 'org.apache.logging.log4j:log4j-api:2.23.1' implementation 'org.apache.logging.log4j:log4j-core:2.23.1' // 核心实现必须存在 } ``` --- ### 步骤2:解决静态初始化问题 当 `LogManager` 类静态初始化失败时: 1. **检查配置文件**: - 确保 `log4j2.xml`/`log4j2.properties` 在类路径(如 `src/main/resources`) - 验证配置文件语法:使用 [XML 验证器](https://www.xmlvalidation.com/) 2. **禁用所有自定义扩展**: ```java // 在启动脚本中添加 System.setProperty("log4j2.disable.jmx", "true"); System.setProperty("log4j2.skipJansi", "true"); ``` --- ### 步骤3:处理类加载器冲突 在容器环境(Tomcat/JBoss)中: 1. **优先使用应用类加载器**: ```bash # 在 catalina.sh 中添加 -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE -Dlog4j2.ignoreTCL=true # 忽略线程上下文类加载器 ``` 2. **检查重复类**: ```java public class ClassPathChecker { public static void main(String[] args) { String classPath = System.getProperty("java.class.path"); System.out.println("Classpath: " + classPath); // 检查是否有多个 log4j-core 版本 } } ``` --- ### 步骤4:验证解决方案 创建测试类: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4jTest { private static final Logger logger = LogManager.getLogger(); public static void main(String[] args) { logger.info("Log4j2 initialized successfully!"); } } ``` > 成功输出表明问题已解决 --- ### 典型错误场景分析 | 场景 | 现象 | 解决方案 | |------|------|----------| | 缺少 `log4j-core` | `NoClassDefFoundError` 指向 `LogManager` | 显式添加 `log4j-core` 依赖 | | SLF4J 桥接冲突 | 控制台提示多个绑定 | 排除 `log4j-to-slf4j` | | 配置文件错误 | 日志不输出但无异常 | 检查配置文件位置和语法 | | 类加载器隔离 | Web 容器中报错 | 添加 `-Dlog4j2.ignoreTCL=true` | --- ### 预防措施 1. **统一依赖管理**: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>2.23.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 2. **启动时诊断**: ```bash java -Dlog4j2.debug=true -jar your-app.jar ``` > 查看控制台输出的 Log4j2 内部初始化过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值