ClassDefNotFoundException, даже если класс загружается загрузчиками классов (на сервере установлено несколько приложений) - PullRequest
0 голосов
/ 06 января 2011

У меня установлено два приложения на Websphere Server v.6.1. SGOApplication 2. ReportingWeb

SGOApplication имеет общую библиотеку, сопоставленную на уровне приложения, т. Е. SGOAPPSHLIB

Эта библиотека имеет jar каркаса ведения журнала (logsrv.jar).В logsrv.jar есть класс с именем SLEEventLogger , который регистрирует сообщения в файл и использует некоторые другие сторонние классы, которые все связаны в logsrv.jar

Я хочу использовать logsrv.банка для ReportingWeb Application .Я сделал вызов для класса SLEEventLogger из другого класса в ReportingWeb.Мне удалось собрать ухо и развернуть его, так как файл logsrv.jar находится в пути сборки.

После этого я попытался выполнить следующие действия, но ни один из них не сработал.

  1. Сопоставленный SGOAPPSHLIB на уровне приложения для приложения ReportingWeb.Сначала использовала политику загрузчика классов приложений.
  2. Создала новую общую библиотеку REPSHLIB и поместила в нее файл logsrv.jar.Сопоставил эту библиотеку с приложением. Сначала использовалась политика загрузчика классов приложений.
  3. Сопоставлена ​​REPSHLIB на уровне сервера.ЭТО РАБОТАЛО для приложения REPORTINGWEB, но SGOApplication другого приложения сейчас не может найти класс.

Я получаю ClassDefNotFoundException: com.statestreet.framework.logging.SLEEventLogger при попыткеЗапустите webapplication, и управление достигло именно этого класса, где я использовал SLEEventLogger.

Я попытался найти класс SLEEventLogger из раздела Устранение неполадок> Загрузчик классов в консоли websphere.Мне удалось обнаружить, что класс SLEEventLogger загружается загрузчиком классов модулей.

Как решить эту проблему?Я попробовал так много перестановок и комбинаций в конфигурации сервера, но безуспешно.Я полностью запутался с этим.

Ответы [ 3 ]

1 голос
/ 06 января 2011

Чтобы сделать это, вам необходимо:

  1. Добавить logsrv.jar в загрузчик классов WebSphere с помощью свойства ws.ext.dirs
  2. Удалить logsrv.jar из приложения и модулейЗагрузчики классов (т.е. включая удаление из WEB-INF/lib)

Я думаю, что вы могли выполнить часть (1) в своей третьей попытке, т.е. когда вы отобразили REPSHLIB на уровне сервера.Вот почему это работает для ReportingWeb .Я предполагаю, что причина, по которой он сломался в SGOApplication , заключается в том, что SGOApplication , вероятно, уже имеет копию logsrv.jar - эта дополнительная копия может конфликтовать с той, которая загружена загрузчиком классов WebSphere.Ключ должен удостовериться, что только одна копия JAR находится в любом из загрузчиков классов.

См. http://www.ibm.com/developerworks/websphere/library/techarticles/0112_deboer/deboer.html#N100F8 для хорошей диаграммы иерархии загрузчика классов WebSphere.

0 голосов
/ 06 января 2011

Это исключение означает, что не может быть найден некоторый класс, от которого зависит com.statestreet.framework.logging.SLEEventLogger.Значение: найден класс com.statestreet.framework.logging.SLEEventLogger.Но это зависит от того, что не может быть найдено, поэтому оно не может быть загружено.Если у вас есть источники, вы можете легко найти все классы, которые использует com.statestreet.framework.logging.SLEEventLogger (просто смотрите импорт).В противном случае вы можете попытаться декомпилировать.

0 голосов
/ 06 января 2011

Я предлагаю включить ведение журнала DEBUG, чтобы дать вам более четкое представление о том, что происходит в вашем приложении.

Конечно, вы упомянули, что ваш файл logsrv.jar был в вашем пути сборки .Стоит отметить, что путь сборки и classpath вашего приложения на самом деле могут не совпадать.

В соответствии с документацией для исключения NoClassDefFoundError, он генерируется, когда класс "существовал, когда текущий исполняемый класс был скомпилирован, но определение больше не найдено."

Другими словами, класс SLEEventLogger был в вашем пути сборки, что позволяло вашему приложению компилироваться, но исключение предполагает, что JAR-файл, содержащий этот класс, скорее всего, не находится в вашем пути к классам.

Когда вы пытаетесьзапустите приложение, класс, который был скомпилирован со знанием того, что SLEEventLogger существует, больше не может его найти;в результате выдается исключение NoClassDefFoundError.

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/NoClassDefFoundError.html

...