天天看點

mongodb的jar包日志檔案和webservice的AxisServlet日志檔案沖突

昨天釋出工程遇到了一個棘手的問題,localhost.log報錯資訊如下: org.apache.commons.discovery.DiscoveryException: No implementation defined for org.apache.commons.logging.LogFactory

at org.apache.commons.discovery.tools.DiscoverClass.find(DiscoverClass.java:404)

at org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:579)

16-Feb-2017 20:34:16.306 INFO [http-nio-8080-exec-493] org.apache.catalina.core.ApplicationContext.log Marking servlet AxisServlet as unavailable

16-Feb-2017 20:34:16.307 SEVERE [http-nio-8080-exec-493] org.apache.catalina.core.StandardWrapperValve.invoke Allocate exception for servlet AxisServlet

 java.lang.NoClassDefFoundError: Could not initialize class org.apache.axis.transport.http.AxisServlet

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

catalina.out的報錯資訊如下:22-Apr-2016 10:49:15.785 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [253] milliseconds.

[2016-04-22 10:49:18,465]-INFO  (CommonsLogger.java:46)|Parsing configuration file [struts-default.xml]

[2016-04-22 10:49:18,744]-INFO  (CommonsLogger.java:46)|Parsing configuration file [struts-plugin.xml]

[2016-04-22 10:49:18,762]-INFO  (CommonsLogger.java:46)|Parsing configuration file [struts.xml]

[2016-04-22 10:49:18,772]-INFO  (CommonsLogger.java:46)|Choosing bean (struts) for (com.opensymphony.xwork2.ObjectFactory)

[2016-04-22 10:49:18,774]-INFO  (CommonsLogger.java:46)|Choosing bean (struts) for (com.opensymphony.xwork2.factory.ActionFactory)

[2016-04-22 10:49:18,775]-INFO  (CommonsLogger.java:46)|Choosing bean (struts) for (com.opensymphony.xwork2.factory.ResultFactory)

[2016-04-22 10:49:18,776]-INFO  (CommonsLogger.java:46)|Choosing bean (struts) for (com.opensymphony.xwork2.factory.ConverterFactory)

糾結了一天之後,發現是AxisServlet的日志檔案是org.apache.commons.logging.Log包下的,由于這次上線了mongodb功能,MongoTemplate.class用的 import org.slf4j.Logger;

import org.slf4j.LoggerFactory  slf4j的日志。打包過程中commons-logging-1.2.jar,slf4j-api-1.77.jar,jcl-over-slf4j-1.7.21.jar同時存在。導緻org.apache.commons.logging.LogFactory 沖突。  jcl-over-slf4j-1.7.21.jar的功能就是用來替代commons-logging系列包的。是以删除commons-logging-1.2系統的jar包,重新開機系統解決問題。