2013-10-10 2 views
0

Контекст таков: у меня есть класс со всеми статическими методами и статический блок инициализации. Этот класс является частью веб-приложения, которое упаковано как война и развернуто внутри WebSphere 10.Можно ли сбросить NoClassDefFoundError ПОСЛЕ того, как класс был загружен/использован?

Бывают ситуации, когда другие классы в войне пытаются вызвать методы в этом классе, только чтобы получить NoClassDefFoundError. Что мне кажется странным, так это то, что из журналов видно, что методы класса и т. Д. Уже были вызваны несколько раз, успешно, но внезапно, идентичный (ранее успешный) вызов метода в настоящее время генерирует NoClassDefFoundError. В этот момент любое будущее таких вызовов статическим методам класса будет генерировать эту ошибку (до тех пор, пока контейнер WebSpehere не будет перезапущен или война не будет развернута).

Что заставляет меня задуматься, почему класс, похоже, работает некоторое время, прежде чем бросать NoClassDefFoundError. documentation по этому исключению говорит:

Определение класса поиска было выполнено, когда выполняемый в данный момент класс был скомпилирован, но определение больше не может быть найдено.

Итак, мой вопрос: как класс полезен для использования некоторое время, четко реагируя на вызовы его статическим методам, а затем бросает NoClassDefFoundError?

+1

Я бы заглянуть в пользовательский класс погрузчиков/агентов, которые вы используете в вашем веб-приложение. Если загрузчик классов, который загрузил класс, больше не является частью иерархии загрузчика (например, если вы используете пользовательские загрузчики классов и там есть какая-то ошибка), эти ошибки могут возникнуть. – Matthias

+0

@ Matthias - это просто простой WebSphere 10.3.3, без настройки для его загрузчиков классов или чего-либо подобного. –

ответ

1

NoClassDefFoundError его не ClassNotFoundException. это может произойти, когда:

Брошенный, если виртуальная машина Java или экземпляр ClassLoader пытается нагрузки в определении класса (как часть нормального вызова метода или , как часть создания нового экземпляра с помощью новое выражение) и не может быть найдено определение класса .

Мой опыт показывает, что если есть исключение в статическом блоке инициализатора, это исключение также может быть выбрано.

Why NoClassDefFoundError caused by static field initialization failure?

+0

Да, но мой вопрос: как можно попасть в ситуацию NoClassDefFoundError даже после того, как статический блок инициализации класса успешно выполнит и даже некоторые успешные вызовы статического метода в этом классе. Разве мы не прошли мимо этого, так как это не определение класса, которое уже успешно найдено и загружено? –

+0

@ShivanDragon Я вижу сейчас. Вы правы, я пропустил ваш вопрос поначалу. Возможно, у вас есть проблемы с загрузкой классов? Я вообще не знаком с WebSphere. взгляните на эту статью, возможно, вы можете найти что-то полезное http://www.javacodegeeks.com/2012/06/javalangnoclassdeffounderror-how-to.html – smajlo

+0

Спасибо, это очень полезно, хотя последнее предложение сделало меня грустным: «Обратите внимание, что Java EE-контейнеры, такие как Oracle Weblogic, имеют механизмы для переопределения этого поведения делегирования загрузчика класса по умолчанию. Я вернусь к этому в будущих статьях». : ((( –

Смежные вопросы