ClassCastExceptions из-за обновления до гибернации 4.2.8 в контейнере приложений WebSphere 8.5.5

Недавно мы обновили спящий режим с 4.0.1 до 4.2.8.Final.

Hibernate.4.2.8.Final зависит от javassist-3.18.1-GA. К сожалению, websphere 8.5.5 не поставляется с последней версией javassist, но это не моя проблема. Я пытался заставить веб-сферу взять мою банку javassist, но мне НЕ УДАЛОСЬ (по какой-то причине она всегда загружается из ${WAS_INSTALL_ROOT}/plugins).

Что я пробовал?

  • Классы сначала загружаются с помощью локального загрузчика классов (родительский последний) в консоли веб-сферы, а WEB-INF/lib содержит последнюю версию jar javassist. Но приложение не работает
  • Поместите последнюю банку javassit в ${WAS_INSTALL_ROOT}/lib/ext, но бесполезно
  • Добавлена ​​​​общая библиотека и ссылка в приложении, но не повезло.
  • Если я заменю javassist.jar в ${WAS_INSTALL_ROOT}/plugins, тогда приложение заработает, но это не очень хорошее решение, потому что другие веб-приложения могут зависеть от старого javassist.

Мой вопрос

Как я могу использовать (или внедрить или передать) последнюю версию jar javassist в Websphere 8.5.5?

Этот #блог помог мне разобраться в нашей проблеме немного быстрее.


person Seeta Ramayya Vadali    schedule 03.01.2014    source источник
comment
Использование локального загрузчика классов сначала (родительский последний) с одним загрузчиком классов на WAR кажется лучшим подходом. Какую ошибку выдавало приложение с последним родителем, было ли это связано с Javassist?   -  person Angular University    schedule 04.01.2014
comment
Да, ту же ошибку я получал либо (последний родитель), либо первый. Также у меня есть последняя версия jar javassist (3.18.1) в WEB-INF/lib   -  person Seeta Ramayya Vadali    schedule 04.01.2014


Ответы (7)


Где вы поставили родителя последним, в каком окне консоли?

Потому что в консоли есть два места, где родитель должен быть последним, одно на уровне приложения, а другое на уровне WAR, и это то, что вы хотите выбрать.

Поместите «Загрузчик классов для каждого файла WAR в приложении», и я полагаю, что внутри экрана, где вы выбрали эту опцию, щелкните WAR и установите политику загрузчика классов на уровне WAR в качестве родителя последним:

Я думаю, что путь таков (сейчас у меня нет консоли):

Приложение --> Корпоративное приложение --> экземпляр_приложения --> Веб-модуль --> Экземпляр_веб-модуля

Взгляните на это, чтобы увидеть, что есть два места для установки политик загрузчика классов, и дайте мне знать, нашли ли вы настройку и работает ли она, или возникает новая ошибка.

Иногда, когда мы переключаем параметр, мы обнаруживаем новые ошибки, потому что другие файлы jar считываются с сервера, а не из WAR, например, ошибки проверки bean-компонента и т. д. Если вы получаете другую ошибку, не связанную с javassist, это может быть вызвано этим, и вы можете всегда публикуйте его в новом вопросе.

person Angular University    schedule 05.01.2014
comment
Спасибо за подробное объяснение и ссылку, которую вы мне дали. Но в ссылке упомянули By specifying PARENT_LAST, your application can override classes contained in the parent classloader, but this action can potentially result in ClassCastException or LinkageErrors if you have mixed use of overriden classes and non-overriden classes как разобраться, какие классы используются в режиме микширования? - person Seeta Ramayya Vadali; 06.01.2014
comment
Вау, я исправил проблему ... ваш пост, особенно ссылка, которую вы мне дали, направили меня в правильном направлении для решения проблемы. - person Seeta Ramayya Vadali; 06.01.2014
comment
Попробуйте запустить, может ошибок нет. Есть способы запросить путь к классам с помощью getClass().getClassLoader().getResource()/getResources(), см. мой ответ на этот пост -java-lang-noclassdeffounderror-org-apache-log4j-logger/20911191#20911191" title="вызвано java lang noclassdeffounderror org apache log4j logger"> stackoverflow.com/questions/20909446/ - person Angular University; 06.01.2014
comment
Я рад, что смог помочь, пожалуйста, отметьте его как принятый, если вы сочли его полезным для решения этих проблем в целом. Есть инструмент JHades jhades.org, который я написал, чтобы помочь с этими проблемами (работает под Java 7), он помогает проблемы с запуском сервера, привет - person Angular University; 06.01.2014
comment
Инструмент JHades интересен. Я постараюсь использовать его, когда у меня возникнут проблемы с путями к классам сервера приложений. - person Seeta Ramayya Vadali; 06.01.2014

Это можно решить, добавив новую версию javaassist в качестве разделяемой библиотеки. Подробности описаны здесь [http://www-01.ibm.com/support/docview.wss?uid=swg27006159#usingserver][1].

Общая библиотека должна быть назначена новому загрузчику классов, определенному в конфигурации сервера. Политика загрузки классов должна быть PARENT_LAST для этого загрузчика классов.

person lloyd chandran    schedule 12.08.2015

Измените политику загрузчика классов WAR на module.

person SB MADDINENI    schedule 04.01.2014
comment
, Если вы говорите о политике загрузчика классов WAR, я пробовал оба следующих Class loader for each WAR file in application Single class loader for application - person Seeta Ramayya Vadali; 04.01.2014
comment
после прочтения комментария jhadesdev и особенно ссылка Я понял, о чем вы говорили, но, к сожалению, ваше заявление было слишком общим. Так и не смог разобраться. - person Seeta Ramayya Vadali; 06.01.2014

Решение проблемы PARENT_LAST, но я изменил страницу настроек приложения (Приложения -> Типы приложений -> Корпоративные приложения WebSphere -> *имя_приложения* -> Загрузка классов и обнаружение обновлений).

К сожалению, это неправильное место для размещения опции PARENT_LAST. Поскольку мое приложение представляет собой веб-модуль (точнее, военный файл ;)) я бы поставил параметр PARENT_LAST в (Приложения -> Типы приложений -> корпоративные приложения WebSphere -> *Имя_приложения*-> Управление модулями -> Имя модуля< /em> -> Порядок загрузчика классов). Я не знаю эту опцию, пока не увижу комментарий jhadesdev и особенно ссылка.

@jhadesdev Еще раз спасибо. Я суммировал все ЗДЕСЬ

person Seeta Ramayya Vadali    schedule 06.01.2014

когда структура вашего приложения довольно проста, я думаю, что эксперимент с войной (изолированный / родительский последний загрузчик классов) может помочь. / hibernate entity — это полноценный ejb-jar, упакованный на самом верхнем уровне. Я не уверен, что смогу легко поиграть с загрузчиком классов, если этот модуль (хотя и не эксперт по веб-сфере)

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

person javapapo    schedule 09.01.2014

Вот небольшое руководство по обновлению javassist в WAS. Это было протестировано с WAS 8.0.0.1. Файл javassist.jar в каталоге WAS_HOME/plugins должен быть заменен файлом jar из: http://search.maven.org/remotecontent?filepath=org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar Оставить старый как резервную копию. Вызовите WAS_HOME/profiles/PROFILE_NAME/bin/osgiCfgInit.sh, а затем WAS_HOME/profiles/PROFILE_NAME/bin/clearClassCache.sh или файлы *.bat на компьютерах с Windows.

Благодаря этому сообщению я узнал, как это сделать: http://ramirezag.wordpress.com/2014/02/27/hibernate-4-2-8-and-websphere-8-5-5-1-issues/

person Christian Beikov    schedule 12.08.2014

Мы используем WAS 8.5.5 и Hibernate 4.3.5 и столкнулись с той же проблемой. Добавление Java Assist в качестве общей библиотеки нам помогло.

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

person Debanga    schedule 17.12.2014