2012-02-23 2 views
1

Я получаю исключение 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. (?)NoClassDefFoundError, созданный даже после того, как объект может быть создан

Вот мой код (линии 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) 
+0

Кажется, вы не включаете 'требуемые файлы jar' в свой путь к классам. – RanRag

+1

Как вы запускаете этот проект (контейнер сервлетов, командная строка, ant-скрипт и т. Д.)? – Fixpoint

+0

@ RanRag - Да, это прямой ответ. Тем не менее, я могу создать объект того же типа, поэтому LogFactory находится в пути к классам в один момент. – JediPotPie

ответ

2

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

+0

Это звучит так, как я думал. Я знаю, что я не представил подробностей об окружающей среде, но есть ли у вас какие-либо предложения о том, как я могу сделать класс LogFactory видимым? У меня нет большого контроля над средой, отличной от этого конкретного исходного кода. Код работает внутри агента событий Symantec SSIM (отсюда мои ограниченные знания о том, как все работает под капотом). Я попытался загрузить классы, добавив библиотеки .jar, используя ClasLoader.getSystemClassLoader(), но это не помогло. Есть ли какой-то классный загрузчик, отличный от SystemClassLoader? – JediPotPie

+1

Да, обычно есть два загрузчика классов с более высоким статусом (или более низкий уровень, в зависимости от того, как вы на него смотрите). Загрузочный загрузчик bootstrap загружает собственные классы JDK, а загрузчик классов расширений загружает классы из каталога расширений (я думаю?). Я подозреваю, что Axis загружается расширителем классов классов, хотя я не уверен, почему кто-то его настроил, и почему они не смогут предоставить свои зависимости, например, Commons Logging. –

+1

Я бы предложил выяснить некоторые факты о том, что загружается с того места. Возможно, вы можете обойти «Class.forName» для всего, о чем можете подумать, и распечатать «getClassLoader()» для каждого. Это может пролить свет на то, откуда загружаются классы. –

Смежные вопросы