NoClassDefFoundError с включен външен проект - JBoss 7.1

Отговарям за 2 проекта едновременно. Първият (A) е библиотека, а вторият (B) Java EE проект, работещ върху JBoss AS 7.1.

B се нуждае от библиотеки от A. И двете са написани с помощта на Eclipse Juno.

Успях да включа проекта A като буркан в папката WEB-INF/lib. Когато направя „повторно публикуване“, A.jar се компилира автоматично и се включва в папката WEB-INF/lib.

Но когато искам да заредя страница, извикваща библиотека от A, имам NoClassDefFoundError на класа от A.


person Florent06    schedule 04.01.2013    source източник


Отговори (2)


NOClassDefFoundError се хвърля, когато JVM или екземпляр на ClassLoader се опита да зареди дефиниция на клас и правилната дефиниция не може да бъде намерена по време на изпълнение.

Така че проверете дали сте пакетирали по-стара (или грешна) версия на класа в библиотека A, различна от необходимата на вашия модул B (типичен пример е, когато класът може да бъде намерен, но той няма дефинициите на метода, необходими на извикващото приложение).

От друга страна, имайте предвид, че по подразбиране JBoss използва унифициран зареждач на класове и делегиране на Java Parent, така че въпреки че една библиотека е разгърната в няколко модула в един и същ екземпляр на JBoss, JBoss зарежда само един (споделяйки го между модулите), като дава предпочитание към този, включен в родителя. Това може да доведе до неочаквано поведение, ако няколко модула трябва да използват различни версии на една и съща библиотека. Така че проверете също дали имате няколко версии на библиотеката A, внедрени във вашия екземпляр на JBoss.

person Toni    schedule 04.01.2013
comment
Това, което току-що забелязах е, че изключенията се появяват, когато извикам конструктора на класа Not-found, а не когато декларирам променлива от този клас. Това улика ли е? - person Florent06; 04.01.2013
comment
Да, извикването на конструктор може да провокира NoClassDefFoundError. Можете да имате няколко конструктора в клас (с различни параметри), така че трябва да сте сигурни, че класът, който пакетирате във вашата библиотека, има дефиницията на конструктора, която използвате във вашата B библиотека, за да създадете обекта. (Имайте предвид, че не е едно и също ClassNotFoundException и NoClassDefFoundError, предполагам, че грешката, която получавате, е NoClassDefFoundError). - person Toni; 04.01.2013
comment
Проверих и конструкторът с добри аргументи е имплементиран в библиотеката на A. - person Florent06; 04.01.2013
comment
Проверихте ли също така, че нямате същия клас, внедрен някъде другаде в същия екземпляр на JBoss (например в друг ear файл, в ‹instance›/lib и т.н.)? В случай, че вече сте го проверили, можете ли да публикувате регистъра на грешките и съответните части от изходния код и инсталационната/опаковъчната структура. - person Toni; 04.01.2013
comment
Мисля, че разреших проблема, като промених версията на Java в аспектите на проекта на A, за да бъде същата като тази на B. А беше на 1.6, а Б на 1.7. Благодаря ви, че ме насочихте към това решение! :-) - person Florent06; 04.01.2013

NoClassDefFoundError се случи, когато класът е наличен по време на компилиране, но не може да бъде намерен по време на изпълнение. Ако сте се уверили, че A.jar е копиран правилно в WEB-INF/lib, тогава друг заподозрян може да е, че липсващият клас не е в този буркан. Опитайте да видите вътре в A.jar, например като го извлечете и вижте дали липсващият клас е вътре в него.

person Jon Kartago Lamida    schedule 04.01.2013
comment
Съжалявам, че не казах, но погледнах и има класове и не са празни. - person Florent06; 04.01.2013