Я отримую помилку NoClassDefFoundError
при запуску мого Java-додатку. З чим зазвичай пов'язана ця помилка?
Хоча можливо, що це пов'язано з невідповідністю шляху класів між часом компіляції та часом виконання, це не обов'язково так.
У цьому випадку важливо тримати в голові два або три різних винятки:
java.lang.ClassNotFoundException
Це виключення вказує на те, що клас не був знайдений на шляху класів. Це вказує на те, що ми намагалися завантажити визначення класу, а клас не існував на шляху до нього.
java.lang.NoClassDefFoundError
Це виключення вказує на те, що JVM шукала у своїй внутрішній структурі даних визначення класу і не знайшла його. Це відрізняється від того, щоб сказати, що його не вдалось завантажити зі шляху до класу. Зазвичай це вказує на те, що ми раніше намагалися завантажити клас зі шляху класів, але з якихось причин це не вдалося - тепер ми намагаємося використати клас знову (і, отже, повинні завантажити його, оскільки це не вдалося минулого разу), але ми навіть не збираємося намагатися завантажити його, тому що ми зазнали невдачі при завантаженні раніше (і обґрунтовано підозрюємо, що зазнаємо невдачі знову). Попередня помилка могла бути виключенням ClassNotFoundException або ExceptionInInitializerError (що вказує на збій в блоці статичної ініціалізації) або будь-якою іншою проблемою. Справа в тому, що помилка NoClassDefFoundError не обов'язково є проблемою шляху до класу.
Я виявив, що іноді я отримую помилку NoClassDefFound, коли код компілюється з несумісною версією класу, знайденою під час виконання. Конкретний випадок, який я пригадую, пов'язаний з бібліотекою apache axis. Насправді було 2 версії на моєму шляху до класу під час виконання, і він підхоплював застарілу і несумісну версію, а не правильну, що викликало помилку NoClassDefFound. Це було в додатку командного рядка, де я використовував команду, подібну до цієї.
set classpath=%classpath%;axis.jar
Я зміг змусити його підібрати правильну версію за допомогою:
set classpath=axis.jar;%classpath%;