Методи ssdeffounderror корекция в Java J2EE
Преводач е благодарен на Виктор Жуковски за ценна редактиране и обсъждане на ръкописа.
Известен като неприятно да видите java.lang.NoClassDefFoundError изключение "основната" нишка. Много разработчици прекарват много време, особено се опитват да разберат какво се е объркало, какво клас липсва и това, което е същността на проблема. Първо, те се бърка един с друг и ClassNotfoundException NoClassDefFoundError. когато в действителност те са две напълно различни изключения. На второ място, те използват метода на "научно копие", за да се реши проблема, вместо да NoClassDefFoundError ясна представа защо е възникнала грешката и как да го поправя. В тази статия, ние ще се отвори за Java някои тайни NoClassDefFoundError корекция на грешки в Java, и ще споделят своя опит в решаването на този проблем.
NoClassDefFoundError грешка не е нещо, което не може да бъде елиминиран или нещо, което е много трудно да бъде сменен - не, NoClassDefFoundError просто проява на друга, по-дълбока грешка, която обърква повечето Java разработчици. NoClassDefFoundError най-често срещаната грешка в развитието на Java, заедно с java.lang.OutOfMemoroyError: Java купчина пространство и java.lang.OutOfMemoryError: PermGen пространство. Нека да видим защо в Java има NoClassDefFoundError и какво да направя, за да го оправя.
Каква е причината NoClassDefFoundError в Java?
NoClassDefFoundError в Java се случва, когато Java виртуална машина по време на изпълнението на кода не може да намери определен клас, който е на разположение по време на компилация. Например, ако ние наричаме метода на класа или се обадете на статичен член на клас, и в този клас не е достъпно по време на изпълнение, на Java Virtual Machine хвърля NoClassDefFoundError. Важно е да се разбере, че тази грешка се различава от ClassNotFoundException изключение. която се проявява, когато се опитате да заредите клас по време на изпълнение, с важно, че това име клас само е определено по време на изпълнение, но не и по време на компилация код. Много Java разработчиците са объркани тези две грешки и се стигне до задънена улица, когато се опитва да разреши проблема.
Накратко, NoClassDefFoundError случва, ако класа присъства по време на компилация, но не и в CLASSPATH по време на изпълнение. Обикновено в този случай, ще видите следния ред в дневника за грешка:
Изключение в резба "основно" java.lang.NoClassDefFoundError
Изключението за израза в дискусия "основната" означава, че е потокът на "главния" не може да намери определен клас. Вместо "основната" може да бъде всеки поток. Разликата между когато се появи грешка в потока на "главния", а в друга нишка е в това, че в случай, в потока "главната" програма е спряна, а в случай на различно нишка, от друга страна, продължава изпълнение след грешка.
Разлика между ClassNotFoundException и java.lang.NoClassDefFoundError в Java
Преди да се има предвид разликата между ClassNotFoundException и NoClassDefFoundError нека да видим какво те са по-чести, а това води до объркване между тези две грешки:
- И двете грешки са свързани с липсата на класа по време на работа;
- И двете грешки са свързани с Java Classpath.
Сега за разликите.
- ClassNotFoundException случва в Java, ако се опитаме да се зареди класа по време на работа с помощта Class.forName () методи. ClassLoader.loadClass () или ClassLoader.findSystemClass (). Освен това се изисква класа не е налична за Java. Често причината е - грешен Classpath. В по-голямата част ни се струва, че ние използваме правилно Classpath. но се оказва, че приложението използва съвсем различен Класпат - не този, който очаквахме. Например, Класпат. Посочената в манифеста на файла буркан, той презаписва Classpath в променливата CLASSPATH среда или -СР опция. предварително определен стартиране буркан файл. За разлика от случая с ClassNotFoundException NoClassDefFoundError проблематично присъстваха клас по време на компилация, и поради това, че програмата е успешно съставяне, но по някаква причина не е клас по време на изпълнение. По мое мнение това е по-лесно да се реши от NoClassDefFoundError ClassNotFoundException. защото вие знаете точно какво е присъствал по време на монтажа на класа, но, общо взето, това е силно зависимо от развитието на околната среда. Ако работите с J2EE среда, можете да получите NoClassDefFoundError дори ако класът е налице, тъй като тя може да бъде невидим за съответния клас товарач.
- ClassNotFoundException е проверен изключение, наследена директно от клас java.lang.Exception. изисква изричното преработка, докато NoClassDefFoundError java.lang.Error. наследена от java.lang.LinkageError.
- ClassNotFoundException се появява в резултат на изрично натоварване Class.forName методи клас (). ClassLoader.loadClass () или ClassLoader.findSystemClass (). докато NoClassDefFoundError - резултатът от неявна клас натоварване, което се случва, когато се опитате да извикате метод от друг клас или достъп до неговите свойства.
NoClassDefFoundError в Java. Примери и скриптове
Така че, по очевидни причини NoClassDefFoundError е, че определен клас не е наличен в Classpath. така че ние трябва да я добавите към Classpath или да разбере защо тя не е в Classpath. въпреки че ние очакваме да го намерите там. Това може да е поради няколко причини:
- Класът не е посочено директно в променлива Classpath.
- Отпечатване на стойност System.getproperty ( "java.classpath") в програма Java.
- Проверете дали променливата на средата Класпат скрипт да стартирате приложения не заместват. Стартирайте програмата с изричното опция -classpath. който уточни CLASSPATH. Кой мислиш, че ще работи, а ако в този случай, програмата работи, това е добър знак, че някой perezatiraet си CLASSPATH.
- Клас не е на мястото, в променливата Класпат.
- Проверете, за да се види дали да се премахне някой буркан-файл, или може да бъде преименуван.
- клас товарач няма разрешение да прочете определен в променлива Classpath файла. на ниво операционна система.
- Използвайте един и същ потребителски идентификатор за всички ресурси на вашето приложение: JAR файлове, библиотеки и конфигурационни файлове.
- Атрибутът клас не е дефинирана във файла на манифеста Classpath, когато стартирате програмата, като използвате командата буркан.
- Ако използвате ANT изграждане файл, за да се създаде JAR файл и файл на манифест, проверка получава ANT изграждане скрипт CLASSPATH правилната стойност и я добавя към MANIFEST.MF файла с Do.
- Java виртуална машина не е намерена една от подчинените, като роден библиотеката. Тази грешка се хвърля, защото NoClassDefFoundError е наследник java.lang.LinkageError.
- Дръжте DLL заедно с JAR-файлове.
- Java виртуална машина не е в състояние да завърши статичен клас инициализация.
- Проверка за java.lang.ExceptionInInitializerError грешки в грешка дънер.
- товарач родител клас не виждам класа, защото той вече е зареден дъщерно товарач. Ако работите с J2EE среда не е конфигуриран клас видимост сред classloaders също могат да доведат до java.lang.NoClassDefFoundError.
- Типо в конфигурацията на XML може да доведе и до NoClassDefFoundError в Java. По-голямата част на софтуерни платформи като пролетта и Struts използвате XML конфигурация за определения боб. Случайно объркали името на боб, можете да получите java.lang.NoClassDefFoundError при зареждането на друг клас, който зависи от боб. Това се случва доста често през пролетта MVC и Apache Struts софтуерни платформи, където можете да получите тон на грешки Изключение в дискусия "основната" java.lang.NoClassDefFoundError по време на инсталацията война или EAR файл.
- Околна среда променливи или JDK инсталиран неправилно.
- Проверка на пътя и JAVA_HOME.
- Казано по друг версия на JDK.
товарач клас в Java
Накратко, ние си спомняме, че товарач клас използва трите основни принципи в работата си: на делегация, видимостта и уникалността.
- Делегиране означава, че всяка молба за зареждане на даден клас е делегирана товарач родител клас.
- Видимостта означава, че можете да намерите на класовете, натоварени с товарач клас: всички товарачи дете клас могат да видят класове зареждат от родител на товарач, но товарача родител не може да види дъщерно клас зареден.
- Уникалност гарантира, че клас товарач заредена с родител, дете, не обувка товарач отново.
Всеки съд от товарач клас има асоциирана майка клас товарач. Да предположим, че ви клас товарач кандидатстване трябва да се зареди клас А. Първото нещо, което вашата кандидатура товарач опитва да делегира търсенето на класовете от А до своята майка клас товарач, преди той да се опитва да го зареди. Можете да се разходите по дългата верига на програми за изтегляне майки, докато стигнете до начало Java виртуална машина товарач.
Така че какъв е проблемът? Ако не се намери един клас А и се зареждат от родител на зареждане, което означава, че детето товарач за зареждане на него ще бъдат унищожени, а може би точно това и чакат, което води до NoClassDefFoundError.
За по-добро разбиране изобразяват целия процес на зареждане в рамките на платформата Java EE.

Както можете да видите, когато се опитате да заредите дете клас товарач (Web App # 1) делегат зареждане родител (Java EE App # 1), която, от своя страна, е делегирал своята система за стартиране товарач JVM. Ако зареждането на системата зареждане на ОС не може да се зареди класа, той се връща товарача родител и така нататък по веригата, докато класът е зареден с товарач.
Помислете за един прост пример, който води до NoClassDefFoundError поради различните класове на погледа между детето и зареждане родител. Направете своя MyClassLoader товарач. наследник на java.lang.Classloader така че да се зарежда класовете с разширение .class .test вместо. net.javacogito са в пакета. Имайте предвид, че по подразбиране стандартно зареждане на ОС на зарежда данните само от файлове с разширение .class на. така изтеглите Bar.test той не може. платка освен работата е, както следва:
- Бар JVM зарежда клас от Bar.test файл.
- Клас Бар отпечатва своя клас товарач. Тя MyClassLoader.
- JVM товари клас Foo от Foo.class файл.
- Клас Foo отпечатва своя клас товарач. Тя sun.misc.Launcher.AppClassLoader.
- Foo клас е статичен метод printClassLoader () в клас Bar.
В този момент, JVM дава NoClassDefFoundError. независимо от факта, че лентата е бил изтеглен по-рано, тъй като товарач родител AppClassLoader не виждам класове заредени с товарач дъщерно MyClassLoader на.
Фигурата по-долу илюстрира схема на товара делегация, в резултат на NoClassDefFoundError.

Изходният код. Клас Bar.
От началото на резултатите показва, че MyClassLoader бар зареден клас. и AppClassLoader (абстрактен клас наследник java.lang.Classloader) зареден класа Foo. Бар клас присъства във файловата система и JVM товара му, но майка ClassLoader товарач не го виждам, което води до NoClassDefFoundError.