NoClassDefFoundError javax / jms /甚至在指定classpath时也是消息

时间:2013-03-08 21:22:08

标签: java exception jms noclassdeffounderror

运行与JMS相关的某些Java代码时遇到错误。我已经把头发拉了两天试图解决这个问题。

我得到的例外是“java.lang.NoClassDefFoundError:javax / jms / Message”

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文件中调用相同的方法。从特定的jar调用此代码时,有些东西没有正确啮合。我检查并重新检查了我的其他代码,以确保它是相同的(它是/是),所以它似乎不是一个代码问题。在某个地方似乎有一些混乱的参考或其他东西。

3 个答案:

答案 0 :(得分: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人员每个都加载不同的副本。

如果不是.....好,发布你看到的内容:)

答案 1 :(得分:0)

在类路径中添加.jar时,需要直接引用jar,而不是它所在的文件夹。

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

答案 2 :(得分:0)

如果WEB-INF中没有lib文件夹,则在其中创建一个lib文件夹。把这个jar: javax.jms.jar 并重启服务器