【问题标题】:NoClassDefFoundError javax/jms/Message even when specifying classpathNoClassDefFoundError javax/jms/Message 即使在指定类路径时
【发布时间】:2013-03-08 21:22:08
【问题描述】:

我在运行某些与 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 调用此代码时,有些东西不正确。我已经检查并重新检查了我的其他代码以确保它是相同的(它曾经是/现在),所以它看起来不像是代码问题。某处似乎有一些混乱的参考或其他东西。

【问题讨论】:

  • 你试过java -classpath /path/lib/javax.jms.jar:. -jar /path/myjarfile.jar ?
  • 我不太了解 JMS 是什么,但我知道“NoClassDefFound”异常通常意味着在编译时发现了某些东西,但在运行时没有发现。
  • @ToddMurray 是的,我已经尝试明确指定 jar。
  • @SatelliteSD 它发生在运行时。我在编译期间看到 0 个错误。
  • 您使用的是什么 JMS 提供程序?通常您需要使用他们的 JMS JAR。

标签: java exception jms noclassdeffounderror


【解决方案1】:

您可能遇到类加载器冲突,其中一个版本的 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 人员分别加载了不同的副本。

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

【讨论】:

  • 好的,我已将静态初始化程序添加到相关类中。我无法从 JMSManager 或 JMSProducer 获得任何输出,但是,下一个类(调用这些东西的地方)称为“JMSService”。我将静态初始化程序添加到该类,现在我收到如下错误: 引起:java.lang.NoClassDefFoundError: javax/jms/Message at Asci.ActiveBatch.JMSAgent.JMSService.(JMSService.java:34)在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  • 您缺少另一个资源。反编译 Asci.ActiveBatch.JMSAgent.JMSService 并查看其依赖关系。你需要为那些找到罐子。
  • @ToddMurray,我有那个类的源代码。它所在的项目有一个对 javax.jms.jar 的引用,其中包含 javax.jms.Message ...
【解决方案2】:

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

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

【讨论】:

  • 哦,是的,对于错误信息,我们深表歉意。我实际上确实尝试过这样做..... java -classpath /path/lib/javax.jms.jar:。 -jar /path/myjarfile.jar
【解决方案3】:

在 WEB-INF 中创建一个 lib 文件夹(如果它还没有的话)。放这个罐子:javax.jms.jar并重启服务器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2014-11-29
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多