beans.xml в JAR вызывает java.lang.NoClassDefFoundError: javax.faces.component.behavior.Behavior

Я использую Websphere 8.5 и его внутренние фреймворки Java EE, Apache OpenWebBeans для DI и Apache MyFaces для просмотра. У меня также есть JAR с некоторыми bean-компонентами, аннотированными "@Named" (так что это управляемые bean-компоненты OpenWebBeans). Этот JAR находится в каталоге «WEB-INF/lib» моего веб-приложения и в пути к классам приложения.

Мне сказали, что я должен поместить файл «beans.xml» в каждый JAR-файл, который я хочу, чтобы реализация CDI находила и управляла bean-компонентами. Я так и сделал (есть файл "beans.xml" в папке "META-INF" приложения и в той же папке JAR), и все работает безупречно в Tomcat 7 (я могу получить доступ к своим bean-компонентам на страницах JSF, все вводится и решается без проблем и т. д.). Я запускаю Tomcat с JAR-файлами Apache Open Web Beans 1.2 и MyFaces 2.0 внутри приложения "WEB-INF/lib".

Теперь проблема: в Websphere с той же конфигурацией (без JAR-файлов фреймворка внутри «WEB-INF/lib» приложения, только JAR моего bean-компонента) я получаю NoClassDefFoundError, ссылаясь на класс JSF, «javax.faces.component. behavior.Behavior» каждый раз, когда я пытаюсь загрузить страницу (кстати, страница не загружается). Как ни странно, когда я удаляю все файлы «beans.xml» из приложения и из JAR, все работает с JSF, как и ожидалось (за исключением загрузки и управления bean-компонентами OpenWebBeans, конечно, поскольку «beans.xml» отсутствует).

Я везде искал эту проблему и не могу найти подсказки об этом. Я знаю, что этот класс доступен для веб-сферы, так как я искал JAR-файлы сервера и нашел его в «WEBSPHERE_INSTALL\plugins\javax.j2ee.jsf.jar» (а также потому, что без «beans.xml» этот класс найден и все работает правильно), но я понятия не имею, почему этот JAR не загружается, когда какой-либо файл "beans.xml" присутствует в загрузчике классов приложения. Может кто-нибудь помочь, пожалуйста?


person Fábio Henrique    schedule 06.04.2015    source источник
comment
Вы вытащили myfaces и OWB из войны перед развертыванием в вебсфере или они все еще там?   -  person covener    schedule 07.04.2015
comment
Да, в WAR нет JAR-файлов фреймворка.   -  person Fábio Henrique    schedule 07.04.2015


Ответы (1)


WebSphere действительно нужен файл WEB-INF/beans.xml в вашей WAR! В противном случае WAS не «активирует» CDI. На самом деле это не требуется спецификацией, но добавление этого файла по крайней мере не запрещено. Он просто сделает все ваши классы в компонентах WEB-INF/classes CDI. Просто наличие META-INF/beans.xml в некоторых банках не помогает.

Так работает WAS, это незначительная вещь, как только вы это знаете. Я даже не удосужился создать PMR ;)

person Mark Struberg    schedule 08.04.2015
comment
Теперь я вижу двусмысленность в вопросе, однако я считаю более вероятным, что у OP он уже давно есть, и просто их наличие в JAR также вызывает проблемы. - person BalusC; 09.04.2015
comment
@BalusC Я бы сказал, маловероятно. WAS-8.5.5 может работать с beans.xml в обоих местах. OWB просто объединит эти 2 вместе. Тот, что находится в WEB-INF/beans.xml, может быть даже пустым. Это просто маркерный файл, который включает функцию CDI в WebSphere. - person struberg; 12.03.2019