tgoop.com/java_geek/364
Last Update:
В Java ошибки 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
BY Java Geek
Share with your friend now:
tgoop.com/java_geek/364
