我正在开发一个使用Java servlet的WebSphere 6.1应用程序。在我的servlet中,我定义了一个序列化版本ID 1L。在部署和运行我的应用程序时,我收到了以下类型的LinkageError (来自服务器日志):
[5/9/11 15:14:26:868 EDT] 0000001c WebApp
E [Servlet Error]-[ManageRecordsConsumerServlet]: java.lang.Exception:
java.lang.LinkageError: LinkageError while defining class:
<redacted>.docindexupdate.batch.servlet.ManageRecordsConsumerServlet
Could not be defined due to: (<redacted>/docindexupdate/batch/servlet
/ManageRecordsConsumerServlet) class name must be a string at offset=2074
This is often caused by having a class defined at multiple
locations within the classloader hierarchy. Other potential causes
include compiling against an older or newer version of the class
that has an incompatible method signature.我不确定问题出在哪里。在定义串行版本的uid之前,我已经看到了这一点,并认为通过定义并保持一致,将来对类文件的更新将会成功运行。在编译或部署到服务器期间没有错误。有没有可能servlet的旧版本被缓存在WebSphere实例上的某个地方(我现在只在我的开发机器上部署)?
这个
class name must be a string at offset=2074line也是令人困惑的。
发布于 2011-05-10 03:47:50
我怀疑您有一个jar正在加载到两个不同的类加载器中。我的意思是,您的websphere服务器在启动时加载该jar,或者有一个包含该jar的批注目录。此外,您正在部署的EAR的库中也包含该jar。两者在运行时可能会发生冲突
我建议找出哪个jar ManageRecordsConsumerServlet属于哪个库,并将其从您的EAR库或Websphere认可的库中删除(最好是您的EAR库)。
发布于 2011-05-10 03:52:40
它可能是版本控制,但我不这么认为。
当两个类由不同的类加载器加载时,通常会抛出ClassNotFoundException。
当一个类通过网络传递/从磁盘缓存加载时,通常会抛出VersionMismatchException。
当使用具有不同方法签名的类时,会抛出NoSuchMethodError或类似的方法。
我认为这个案例是一个损坏的类文件。可能在缓存或JAR中损坏。
https://stackoverflow.com/questions/5941626
复制相似问题