引入中间基 class 导致 ActiveMQ/JMS NoClassDefFoundError
Introducing a middle base class causes ActiveMQ/JMS NoClassDefFoundError
目前我有一个应用程序将 JMS ObjectMessage
发送到 ActiveMQ 目的地。消息全部来源于class base
.
但是,我需要在某些派生的 classes 和基础 class 之间添加一个 class,所以 class middle
extends base
.现在,扩展 middle
的所有消息都无法发送,出现以下错误:
26 18:53:04.524 [ListenerContainer-1] WARN - Execution of JMS message listener failed
java.lang.NoClassDefFoundError: com/google/protobuf/ProtocolMessageEnum
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access[=12=]0(URLClassLoader.java:58)
at java.net.URLClassLoader.run(URLClassLoader.java:197)
...
Caused by: java.lang.ClassNotFoundException: com.google.protobuf.ProtocolMessageEnum
at java.net.URLClassLoader.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
不扩展中间的消息仍然有效,现在只有从 middle
派生的消息导致问题。任何帮助表示赞赏。谢谢!
编辑:发送由 session.createObjectMessage(msg)
处理,其中 msg
的类型为 base
。
考虑到您正在发送 JMS ObjectMessage
,在我看来您的客户端在 class 路径上没有正确的 classes 来反序列化消息。确保客户端在其 class 路径上具有 "middle" class 和任何新参数类型。至少他们需要 com.google.protobuf.ProtocolMessageEnum
(如异常所示)。
就其价值而言,JMS ObjectMessage
通常由于这个和其他原因而被避免。发送原始字节缓冲区或一些简单的对象表示(例如 XML、JSON 等)而不是实际的 Java 对象通常更简单。此外,Java 序列化和反序列化速度非常慢,这种模式也可能使您的应用程序面临安全漏洞。
目前我有一个应用程序将 JMS ObjectMessage
发送到 ActiveMQ 目的地。消息全部来源于class base
.
但是,我需要在某些派生的 classes 和基础 class 之间添加一个 class,所以 class middle
extends base
.现在,扩展 middle
的所有消息都无法发送,出现以下错误:
26 18:53:04.524 [ListenerContainer-1] WARN - Execution of JMS message listener failed
java.lang.NoClassDefFoundError: com/google/protobuf/ProtocolMessageEnum
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access[=12=]0(URLClassLoader.java:58)
at java.net.URLClassLoader.run(URLClassLoader.java:197)
...
Caused by: java.lang.ClassNotFoundException: com.google.protobuf.ProtocolMessageEnum
at java.net.URLClassLoader.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
不扩展中间的消息仍然有效,现在只有从 middle
派生的消息导致问题。任何帮助表示赞赏。谢谢!
编辑:发送由 session.createObjectMessage(msg)
处理,其中 msg
的类型为 base
。
考虑到您正在发送 JMS ObjectMessage
,在我看来您的客户端在 class 路径上没有正确的 classes 来反序列化消息。确保客户端在其 class 路径上具有 "middle" class 和任何新参数类型。至少他们需要 com.google.protobuf.ProtocolMessageEnum
(如异常所示)。
就其价值而言,JMS ObjectMessage
通常由于这个和其他原因而被避免。发送原始字节缓冲区或一些简单的对象表示(例如 XML、JSON 等)而不是实际的 Java 对象通常更简单。此外,Java 序列化和反序列化速度非常慢,这种模式也可能使您的应用程序面临安全漏洞。