Как исправить исключение Java LinkageError? - PullRequest
3 голосов
/ 09 мая 2011

Я занимаюсь разработкой приложения для WebSphere 6.1, в котором используется сервлет Java. В моем сервлете я определил серийный номер версии 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, и подумал, что, определив это и будучи непротиворечивым, будущие обновления файла класса будут выполняться успешно. Нет ошибок при компиляции или развертывании на сервере. Возможно ли, что более старая версия сервлета кэшируется где-то на экземпляре WebSphere (в данный момент я только внедряю на моей машине разработки)?

 class name must be a string at offset=2074

строка тоже сбивает с толку.

Ответы [ 2 ]

5 голосов
/ 09 мая 2011

Я подозреваю, что у вас есть фляга, которая загружается в два разных загрузчика классов.Под этим я подразумеваю, что ваш сервер websphere при запуске загружает этот jar или имеет одобренный каталог с этим jar.Также у вашего EAR, который вы развертываете, есть этот jar в его lib.Они могут конфликтовать во время выполнения

. Я бы посоветовал выяснить, к какому jar-списку принадлежит ManageRecordsConsumerServlet, и удалить его из вашей EAR-библиотеки или из вашей одобренной Websphere библиотеки (лучше всего это будет ваша EAR-библиотека).

0 голосов
/ 09 мая 2011

Возможно, это версия, но я так не думаю.

Когда два класса загружаются разными загрузчиками классов, обычно генерируется исключение ClassNotFoundException.

Когда класс передается по проводам / загружается из дискового кэша, обычно генерируется исключение VersionMismatchException.

Когда используется класс с разными сигнатурами методов, генерируется NoSuchMethodError или аналог.

Я думаю, что это случай с поврежденным файлом класса. Может быть поврежден в кеше или в JAR.

...