2013-03-08 2 views
5

У меня возникает ошибка при запуске определенного кода Java, относящегося к JMS. Я вытягивал свои волосы в течение 2 дней, пытаясь понять это.NoClassDefFoundError javax/jms/Сообщение даже при указании пути к классам

Исключение я получаю "java.lang.NoClassDefFoundError: javax/JMS/Сообщение"

java.lang.NoClassDefFoundError: javax/jms/Message 
    at Asci.ActiveBatch.JMSAgent.JMSManager.createMsg(JMSManager.java:195) 
    at Asci.ActiveBatch.JMSAgent.JMSService.SendMessageHandler(JMSService.java:160) 

Не вдаваясь в излишние подробности, это имеет в виду эту линию:

public static void createMsg(String icf, String url, String cf, String QName, String msgText, String[] props, String user, String pass) throws Exception { 
    JMSProducer.produceMsg(icf, url, cf, QName, msgText, props, user, pass); 
} 

(не спрашивайте, почему эта функция только в основном отображение на другой ... Я изначально не писать этот код)

Я звоню этот код, как

java -jar /path/myjarfile.jar 

javax.jms.jar входят в манифесте, Jar (и она существует в этом месте), но только в том случае, если я также пробовал, включая путь к классам моей Lib папке (которая содержит javax.jms.jar , конечно) следующим образом:

java -classpath /path/lib:. -jar /path/myjarfile.jar 

Мне до сих пор не повезло. Я не уверен, что делать или как отлаживать эту проблему. Любая помощь будет принята с благодарностью. Очевидно, что этот код компилируется, поэтому эти классы должны быть доступны (по крайней мере) во время компиляции.

Спасибо.

правок:

1) Я также попробовать Java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar

2) Эта проблема возникает во время выполнения, а не времени компиляции.

3) Итак, у меня есть другой код, который вызывает тот же метод в том же файле jar, который работает. Когда вы вызываете этот код из конкретной банки, что-то не зацепляется. Я проверил и повторно проверил мой другой код, чтобы убедиться, что он идентичен (что он/был), поэтому он не похож на проблему с кодом. Кажется, что-то есть какая-то испорченная ссылка или что-то еще.

+0

Вы пробовали java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar? –

+0

Я действительно не понимаю, что такое JMS, но я знаю, что «NoClassDefFound»-Exeption часто означает, что что-то было найдено во время компиляции, но не во время выполнения. – sschrass

+0

@ToddMurray Да, я попытался четко указать банку. – bdzevel

ответ

0

При добавлении .jar к классам, вы должны ссылаться на банку непосредственно, а не папку это в.

java -classpath /path/lib/JMS.jar:. -jar /path/myjarfile.jar 
+0

О да, извините за дезинформацию. Я действительно попытался сделать это ..... java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar – bdzevel

4

Вполне возможно, что у Вас есть загрузчики классов конфликт, где одна версия javax. jms.Message загружается в один загрузчик классов, а затем он запускает головки с другой версией, загруженной из другого загрузчика классов.

Можете ли вы добавить статический инициализатор в JMSManager и JMSProducer, чтобы сделать что-то вроде этого?

static { 
    System.out.println("MESSAGE CLASSLOADER IN JMSMANAGER:" + 
     javax.jms.Message.class.getProtectionDomain().getCodeSource().getLocation()); 
} 

Если они печатают разные URL-адреса, это означает, что у вас есть несколько копий javax/JMS/Message.class в пути к классам, и два ваших JMS ребята загружаются разные из них каждый.

Если нет ..... ну, после того, что вы видите :)

+0

OK Я добавил статические инициализаторы к рассматриваемым классам. Мне не удалось получить какой-либо результат от JMSManager или JMSProducer, однако следующий класс вверх (откуда эти вызовы вызывается) называется «JMSService». Я добавил статический инициализатор к этому классу, и теперь я получаю сообщение об ошибке следующим образом: Caused by: java.lang.NoClassDefFoundError: javax/jms/Message at Asci.ActiveBatch.JMSAgent.JMSService. (JMSService.java:34) at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (родной метод) – bdzevel

+0

Вам не хватает другого ресурса. Декомпилируйте Asci.ActiveBatch.JMSAgent.JMSService и посмотрите на его зависимости. Вам нужно будет найти банки для них. –

+0

Но ... Я вижу Message.class в javax.jms.jar ... – bdzevel

0

Создать Lib папку внутри WEB-INF, если она не существует уже.Поместите эту банку: javax.jms.jar и перезапустить сервер

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