NoClassDefFoundError и NoSuchMethodError относятся к runtime ошибкам, возникающим в процессе выполнения программы, и обычно связаны с проблемами совместимости, загрузки классов и зависимости.❗
NoClassDefFoundError💥 Причина:
JVM не может найти определение класса во время выполнения, хотя он был доступен во время компиляции.
🔍 Частые причины:
1. Класс отсутствует в classpath во время запуска.
- Например, зависимость была на этапе компиляции, но не добавлена в JAR или отсутствует в runtime classpath.
2. Исключение при инициализации класса (
ExceptionInInitializerError).- Если статический блок инициализации выбрасывает исключение, класс считается «не загруженным».
3. Разные classloaders.
- В особенно сложных системах (например, сервлеты, Spring, OSGi), разные classloader'ы могут видеть разные классы.
4. Удалён/переименован класс после компиляции.
❗
NoSuchMethodError💥 Причина:
JVM не может найти метод с указанной сигнатурой в классе во время выполнения.
🔍 Частые причины:
1. Метод существует во время компиляции, но изменён или удалён после:
- Например, библиотека была обновлена, и сигнатура метода изменилась.
2. Несовместимость версий библиотек:
- Одна библиотека компилируется с одной версией зависимости, а в рантайме подключена другая версия (без нужного метода).
3. Переопределение метода в наследнике может не сработать, если структура иерархии классов поменялась между компиляцией и выполнением.
✅ Как диагностировать и решать
1. Проверить classpath:
- Используй
-verbose:class при запуске JVM, чтобы увидеть, откуда загружаются классы.2. Проверить версии зависимостей:
- Инструменты вроде
mvn dependency:tree или gradle dependencies помогут выявить конфликты.3. Проверить jar-файлы на наличие нужных классов/методов:
- Распаковать jar:
jar tf your-lib.jar- Проверить сигнатуры методов с помощью
javap.4. Избегай теневых зависимостей (shadow dependencies).
5. Используй dependency management:
- Например, в Maven зафиксировать версии зависимостей через
<dependencyManagement>.👉 @java_geek