如何更正Java LinkageError异常?

时间:2011-05-09 19:39:12

标签: java exception servlets classloader

我正在开发一个使用Java servlet的WebSphere 6.1应用程序。在我的servlet中,我定义了一个1L的序列版本ID。部署并运行我的应用程序后,我收到以下类型的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时看到了这一点,并认为通过定义并保持一致,类文件的未来更新将成功运行。在编译或部署到服务器期间没有错误。是否有可能在WebSphere实例上的某个地方缓存旧版本的servlet(我目前只在我的开发机器上部署)?

 class name must be a string at offset=2074

行也令人困惑。

2 个答案:

答案 0 :(得分:5)

我怀疑你有一个装在两个不同类加载器中的jar。我的意思是,你的websphere服务器在启动时加载了jar或者有一个带有该jar的endorsed目录。您正在部署的EAR也在其lib中具有该jar。这两者可能在运行时发生冲突

我建议找出哪个jar的ManageRecordsConsumerServlet属于哪个jar,并将其从你的EAR lib或你的Websphere认可的lib中删除(最好是你的EAR lib)。

答案 1 :(得分:0)

它可能是版本控制,但我不是这样。

当两个类由不同的类加载器加载时,通常会抛出ClassNotFoundException。

当通过有线/从磁盘缓存加载的类传递时,通常会抛出VersionMismatchException。

当使用具有不同方法签名的类时,抛出NoSuchMethodError或类似。

我认为这种情况是一个损坏的类文件。可能在缓存或JAR中被破坏。