NoClassDefFoundError выбрасывается даже после того, как объект может быть создан - PullRequest
1 голос
/ 23 февраля 2012

Я получаю исключение NoClassDefFoundError на org.apache.commons.logging.LogFactory после того, как я уже создал экземпляр. Я могу просто создать объект LogFactory и получить от него экземпляр org.apache.commons.logging.Log, но при создании объекта типа org.apache.axis.description.TypeDesc выдается NoClassDefFoundError, когда этот класс пытается получить экземпляр org.apache.commons.logging.Log из LogFactory. Похоже, что исключение должно быть выдано в строке 284. (?)

Вот мой код (строки DtUiLoggingRequest с 282 по 294);

log.debug("vvvvvvvvvvvvvvvv");

org.apache.commons.logging.LogFactory logFactory = (org.apache.commons.logging.LogFactory)LogFactory.getFactory();
Log myLog = LogFactory.getLog(DtUiLoggingRequest.class.getName());

log.debug(logFactory.getClass().getName());
log.debug(myLog.getClass().getName());

myLog.debug("This is coming from 'myLog'");

log.debug("^^^^^^^^^^^^^^^^");

typeDesc = new org.apache.axis.description.TypeDesc(DtUiLoggingRequest.class);

Вот что говорит журнал;

DEBUG   2012-02-23 09:32:08,739 vvvvvvvvvvvvvvvv  
DEBUG   2012-02-23 09:32:08,739 org.apache.commons.logging.impl.LogFactoryImpl  
DEBUG   2012-02-23 09:32:08,739 org.apache.commons.logging.impl.Log4JLogger  
DEBUG   2012-02-23 09:32:08,739 ^^^^^^^^^^^^^^^^  
ERROR   2012-02-23 09:32:08,739 Exception Details:  
java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory  
    at org.apache.axis.components.logger.LogFactory.class$(LogFactory.java:45)  
    at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)  
    at java.security.AccessController.doPrivileged(Native Method)  
    at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)  
    at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)  
    at org.apache.axis.description.TypeDesc.<clinit>(TypeDesc.java:61)  
    at com.symantec.cas.ucf.sensors.DtUiLoggingRrequest.initTypeDesc(DtUiLoggingRequest.java:294)  
    at com.symantec.cas.ucf.sensors.sap.DtUiLoggingRequest.<init>(DtUiLoggingRequest.java:58)  
    at com.symantec.cas.ucf.sensors.sap.SapSensor.OpenDevice(Sensor.java:151)  
    at com.symantec.cas.ucf.collector.SensorJob.openSensor(SensorJob.java:156)  
    at com.symantec.cas.ucf.collector.SensorJob.run(SensorJob.java:290)  
    at java.lang.Thread.run(Thread.java:662)  

1 Ответ

2 голосов
/ 23 февраля 2012

Это похоже на проблему загрузчика классов для меня. Вы работаете в системе с иерархическими загрузчиками классов, например в веб-приложении, и Axis загружается загрузчиком классов с более высоким статусом, чем Commons Logging. Это означает, что, хотя Commons Logging находится в вашей системе, Axis не может его видеть. Моим диким предположением будет то, что вы загружаете Axis из каталога расширений JRE, а Commons Logging из вашего файла войны.

...