Axis Client 调用asmx 错误No implementation defined for org.apache.commons.logging.LogFactory

本文介绍了在Tomcat中遇到的由于缺少默认日志实现类而导致的DiscoveryException异常,并提供了具体的解决方案,即通过设置commons-logging.properties文件来指定使用Log4J作为默认的日志实现。

本地单元测试没有问题,发布到Tomcat   出现异常:

Caused by: org.apache.commons.discovery.DiscoveryException: No implementation defined for org.apache.commons.logging.LogFactory

原因是没有默认的 日志实现类,

解决方法: 

在类路径下新建commons-logging.properties(如果已存在则编辑), 

加入内容

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

指定默认的日志实现类为  log4j

### Java中ExceptionInInitializerError异常与Apache AxisCommons Logging相关问题的解决方法 在Java中,`ExceptionInInitializerError`通常是由静态初始化块或静态变量初始化时抛出的异常引起的。当涉及到Apache AxisCommons Logging时,这种异常通常与日志框架的初始化失败有关[^1]。 #### 1. 异常的根本原因 `No implementation defined for LogFactory` 表示Commons Logging无法找到合适的日志实现类。Commons Logging通过`LogFactory`接口来选择具体的日志实现(如JDK Logging、Log4j等)。如果未正确配置日志实现,或者存在多个冲突的日志库版本,可能导致`LogFactory`无法加载正确的实现类[^2]。 #### 2. 解决方案 以下是几种可能的解决方案: - **移除冲突的依赖** 如果项目中同时存在多个日志框架(如`commons-logging.jar`和`slf4j`),可能会导致冲突。可以通过以下方式解决: - 确保只引入一个日志实现库,例如`slf4j`。 - 使用桥接器(如`jcl-over-slf4j.jar`)将Commons Logging重定向到SLF4J[^3]。 - **检查类加载顺序** Apache Axis通过`Commons Discovery`机制查找日志实现类。如果类路径中存在多个`LogFactory`实现,可能会导致加载错误。可以参考以下配置[^4]: ```properties org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.SimpleLog ``` 将此配置添加到`logback.xml`或`logback-test.xml`中,确保使用简单的日志实现。 - **验证依赖版本** 确保所有依赖库的版本兼容。例如,`slf4j-api`和`logback-classic`的版本应保持一致。以下是推荐的依赖列表: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.30</version> </dependency> ``` #### 3. 示例代码 以下是一个完整的示例,展示如何通过SLF4J桥接Commons Logging并避免`ExceptionInInitializerError`异常: ```java package com.unmi; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestJCLOverSlf4j { // SLF4J 的 Logger private static final Logger logger = LoggerFactory.getLogger("From SLF4J"); // JCL 的 Log private static final Log log = LogFactory.getLog("From JCL"); public static void main(String[] args) { try { logger.info("Hello {} from SLF4J", "World"); log.info("Hello from JCL"); } catch (ExceptionInInitializerError e) { logger.error("Initialization error occurred", e); } } } ``` #### 4. 注意事项 - 确保`jcl-over-slf4j.jar`存在于类路径中,并排除原始的`commons-logging.jar`。 - 如果仍然出现异常,可以通过调试工具查看具体的异常堆栈信息,定位问题所在。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值