常见的日志jar与apache axis soap客户端冲突

我在尝试使用axis调用SOAP webservice时遇到此exception。 基本上我写了一个轴客户端。

org.apache.commons.discovery.DiscoveryException: Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging.LogFactory. 

当我删除所有常见的日志记录jar时,我可以删除这些错误,但这些jar子来自其他api,我没有控制它们。

有没有办法克服这个问题?

有一个非常详细的解释,问题是什么以及在commons日志记录文档中调试它的方法。 你的具体问题可能是,

还有另一种更不寻常的方式,这种方法可能会失败:即使二进制文件兼容,运行时加载的实现类也可能链接到LogFactory类的不同实例。 有关更多信息,请参阅技术指南 。

链接到上述文档的 “修复”部分建议包含

  -Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl 

在你的设置中。 对于某些人来说,可能更容易包含此代码:

 static { System.setProperty(LogFactory.FACTORY_PROPERTY, LogFactory.FACTORY_DEFAULT); } 

这些解决方案都不适合我。 我在SLF4J文档中找到了我的解决方案

http://slf4j.org/faq.html#excludingJCL

备选方案2)提供范围通过在项目的pom.xml文件中的提供范围内声明它,Commons-logging可以简单方便地作为依赖项排除。 实际的公共日志记录类将由jcl-over-slf4j提供。 这转换为以下pom文件片段:

  commons-logging commons-logging 1.1.1 provided   org.slf4j jcl-over-slf4j 1.7.21  

第一个依赖声明基本上声明commons-logging将由您的环境“以某种方式”提供。 第二个声明包括jcl-over-slf4j到您的项目中。 由于jcl-over-slf4j是公共日志记录的完美二进制兼容替代品,因此第一个断言成为现实。 遗憾的是,虽然在提供的范围内声明commons-logging会完成工作,但是您的IDE(例如Eclipse)仍会将commons-logging.jar放在项目的类路径中,如IDE所示。 您需要确保在IDE的commons-logging.jar之前可以看到jcl-over-slf4j.jar。

SLF4J文档提供了更多选择,这对我有用。