java lang classnotfoundexception как исправить
Как исправить ошибку java.lang.NoClassDefFoundError в Java J2EE
Я потратил довольно много времени, чтобы выяснить как исправить ошибку java.lang.NoClassDefFoundError в Java.
В этой инструкции я покажу как исправить эти ошибки, раскрою некоторые секреты NoClassDefFoundError и поделюсь своим опытом в этой области.
NoClassDefFoundError — это самая распространенная ошибка в разработке Java. В любом случае, давайте посмотрим, почему это происходит и что нужно сделать для разрешения проблемы.
Разбираемся с причинами noclassdeffounderror в Java
NoClassDefFoundError в Java возникает, когда виртуальная машина Java не может найти определенный класс во время выполнения, который был доступен во время компиляции.
Например, если у нас есть вызов метода из класса или доступ к любому статическому члену класса, и этот класс недоступен во время выполнения, JVM сгенерирует NoClassDefFoundError.
Важно понимать, что это отличается от ClassNotFoundException, который появляется при попытке загрузить класс только во время выполнения, а имя было предоставлено во время выполнения, а не во время компиляции. Многие Java-разработчики смешивают эти две ошибки и запутываются.
NoClassDefFoundError возникнет, если класс присутствовал во время компиляции, но не был доступен в java classpath во время выполнения. Обычно появляется такая ошибка:
Разница между java.lang.NoClassDefFoundError и ClassNotFoundException в Java
ClassNotFoundException возникает, когда JVM пытается загрузить класс во время выполнения, т.е. вы даете имя класса во время выполнения, а затем JVM пытается загрузить его, и если этот класс не найден, он генерирует исключение java.lang.ClassNotFoundException.
Тогда как в случае NoClassDefFoundError проблемный класс присутствовал во время компиляции, и поэтому программа успешно скомпилирована, но не доступна во время выполнения по любой причине.
Приступим к решению ошибки java.lang.NoClassDefFoundError.
Нам нужно добавить NoClassDefFoundError в Classpath или проверить, почему он не доступен в Classpath. Там может быть несколько причин, таких как:
Примеры
NoClassDefFoundError в Java из-за исключения в блоке инициализатора
Это еще одна распространенная причина java.lang.NoClassDefFoundError, когда ваш класс выполняет некоторую инициализацию в статическом блоке и если статический блок генерирует исключение, класс, который ссылается на этот класс, получит NoclassDefFoundError.
Смотрите в журнале java.lang.ExceptionInInitializerError, потому что это может вызвать java.lang.NoClassDefFoundError: Could not initialize class.
Как и в следующем примере кода, во время загрузки и инициализации класса, пользовательский класс генерирует Exception из статического блока инициализатора, который вызывает ExceptionInInitializerError при первой загрузке пользовательского класса в ответ на новый вызов User ().
Как разрешить исключение ClassNotFoundException?
Я пытаюсь запустить приложение Java, но получаю эту ошибку:
после двоеточия приходит расположение класса, который отсутствует. Однако, я знаю, что это место не существует, так как класс находится в другом месте. Как я могу обновить этот класс? Это как-то связано с классовым путем?
17 ответов
ваш classpath сломан (что является очень распространенная проблема в мире Java).
путь к классам-это список местоположений для загрузки классов.
эти «местоположения» могут быть либо каталогами, либо файлами jar.
для каталогов JVM будет следовать ожидаемому шаблону для загрузки класса. Если у меня есть каталог C:/myproject/classes в моем classpath, и я пытаюсь загрузить класс com.mycompany.Фу!—6—>, он будет искать в каталоге классов для каталога под названием com, тогда под этим каталогом называется mycompany и, наконец, он будет искать файл с названием Фу.класс!—6—> в этом каталоге.
во втором случае для файлов jar он будет искать файл jar для этого класса. Файл jar-это в реальности просто набор сжатых папок как выше. Если вы распакуете файл jar, вы получите кучу каталогов и файлов классов, следуя приведенному выше шаблону.
таким образом, JVM пересекает путь классов от начала до конца, ища определение класса при попытке загрузить определение класса. Например, в пути к классам:
JVM попытается посмотреть в каталоге классы, затем в вещи.Джар и, наконец, в otherstuff.Джар.
когда вы получаете ClassNotFoundException, это означает, что JVM пересек весь путь к классам и не найден класс вы пытались ссылаться. Решение, как это часто бывает в мире Java, чтобы проверить ваш classpath.
вы определяете путь к классам в командной строке, говоря java-cp и тогда ваш classpath. В среде IDE, такой как Eclipse, у вас будет опция меню для указания пути к классам.
это лучшим решением я нашел до сих пор.
Предположим, у нас есть пакет под названием org.mypackage содержащие классов:
и файлы, определяющие этот пакет, физически хранятся в каталоге D:\myprogram (в Windows) или /home/user/myprogram (на Linux).
структура файла будет выглядеть этот:
Если вы знаете путь к классу или банку, содержащую класс, добавьте его в свой путь к классу во время его запуска. Вы можете использовать путь к классам, как указано здесь:
попробуйте это, если вы используете maven. Я использую maven для своего проекта и когда я это делаю mvn clean install и попробуйте запустить программу, которая выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.
Я использую Eclipse IDE.
для класса не найдено исключение при запуске теста Junit, попробуйте запустить mvn clean test раз. Он будет компилировать все тестовые классы.
использовать ‘;’ в качестве разделителя. Если переменные среды установлены правильно, вы должны увидеть свои настройки. Если ваш путь и путь к классам верны, windows должна распознавать эти команды. При установке Java перезагрузка компьютера не требуется.
пути не работали для меня:
3) копирование jar в текущую папку проекта
4) Копирование jar в стандартное расположение Java jars (/usr/share / java)
это решение сообщается для класса com.для MySQL.интерфейс jdbc.Драйвер в mysql-connector-java.5-*.jar, работающий на linux с OpenJDK версии 1.7
поднимитесь наверх и удалите инструкцию import, если она есть, и повторно импортируйте класс. Но если это не так, сделайте чистую, а затем постройте. Вы используете Netbeans или Eclipse?
это может произойти, если ваш путь к классам неверен
давайте постулировать сериализуемый класс и класс deserializable под одной имя_проекта. Вы запускаете сериализуемый класс, создавая сериализуемый объект в определенной папке. Теперь вам нужны дезариализованные данные. Тем временем, если вы измените название проекта, он не будет работать. Сначала необходимо запустить сериализуемый класс, а затем десериализовать файл.
Если вы используете maven попробуйте Maven обновить все проекты и принудительно для снимков. Он также очистит и перестроит весь classpath.. Это решило мою проблему..
Я только что сделал
1.Аннулировать кэш и перезапустить
2.восстановил мой проект который решил проблему
Это может произойти в Windows после обновления java, где отсутствует старая версия Java SDK и присутствует новая. Я бы проверил, использует ли ваша IDE установленную версию Java SDK (IntelliJ: CTRL + SHIFT + ALT + S)
Если вы добавили несколько (сторонние)**библиотеки и расширяет * * приложение класс
тогда это может произойти.
поместите весь код в блок try, затем поймайте исключение в блоке catch
Исключение ClassNotFoundException против NoClassDefFoundError
Узнайте о различиях между ClassNotFoundException и NoClassDefFoundError.
1. введение
Оба ClassNotFoundException и NoClassDefFoundError возникают, когда JVM не может найти запрошенный класс в пути к классам. Хотя они выглядят знакомыми, между этими двумя есть некоторые основные различия.
В этом уроке мы обсудим некоторые причины их возникновения и их решения.
2. Исключение ClassNotFoundException
ClassNotFoundException является проверяемым исключением, которое возникает, когда приложение пытается загрузить класс с помощью его полного имени и не может найти его определение в пути к классу.
Например, давайте попробуем загрузить класс драйвера JDBC без добавления необходимых зависимостей, которые приведут к исключению ClassNotFoundException:
3. NoClassDefFoundError
NoClassDefFoundError является фатальной ошибкой. Это происходит, когда JVM не может найти определение класса при попытке:
Ошибка возникает, когда компилятору удалось успешно скомпилировать класс, но среде выполнения Java не удалось найти файл класса. Обычно это происходит, когда возникает исключение при выполнении статического блока или инициализации статических полей класса, поэтому инициализация класса завершается неудачно.
Давайте рассмотрим сценарий, который является одним из простых способов воспроизвести проблему. Класс в нем ошибается инициализация создает исключение. Поэтому, когда мы пытаемся создать объект класса В нем Возникают ошибки, он выдает exceptioninitializererror.
Если мы попытаемся снова загрузить тот же класс, мы получим NoClassDefFoundError:
Давайте напишем тестовый пример для этого сценария:
4. Разрешение
Иногда диагностика и устранение этих двух проблем может занять довольно много времени. Основной причиной обеих проблем является недоступность файла класса (в пути к классу) во время выполнения.
Давайте рассмотрим несколько подходов, которые мы можем рассмотреть при работе с любым из них:
5. Краткое изложение
Хотя оба эти исключения связаны с тем, что путь к классам и среда выполнения Java не могут найти класс во время выполнения, важно отметить их различия.
Среда выполнения Java выдает ClassNotFoundException при попытке загрузить класс только во время выполнения, и имя было указано во время выполнения. В случае NoClassDefFoundError класс присутствовал во время компиляции, но среда выполнения Java не смогла найти его в пути к классам Java во время выполнения.
Как разрешить ClassNotFoundException?
Я пытаюсь запустить приложение Java, но получаю эту ошибку:
после двоеточия приходит расположение класса, который отсутствует. Однако, я знаю, что это место не существует, так как класс находится в другом месте. Как я могу обновить этот класс? Это имеет какое-то отношение к пути к классу?
17 ответов:
ваш путь к классам нарушен (что является очень распространенная проблема в мире Java).
путь к классу-это список мест для загрузки классов.
эти «места» могут быть либо каталогами, либо файлами jar.
для каталогов JVM будет следовать ожидаемому шаблону для загрузки класса. Если у меня есть каталог C:/myproject/classes в моем classpath, и я пытаюсь загрузить класс com.название_компании.Фу, он будет искать в каталоге классов для каталога под названием com, тогда под этим каталогом называется название_компании и, наконец, он будет искать файл с названием Фу.класс в этом каталоге.
во втором случае, для файлов jar, он будет искать файл jar для этого класса. Файл jar-это на самом деле просто сжатая коллекция каталогов, подобных приведенным выше. Если вы распакуете файл jar, вы получите кучу каталогов и файлов классов, следуя приведенному выше шаблону.
таким образом, JVM пересекает путь к классу от начала до конца, ища определение класса при попытке загрузить определение класса. Например, в пути к классу:
JVM попытается заглянуть в каталог классы, затем в вещи.банку и, наконец, в otherstuff.банку.
когда вы получаете ClassNotFoundException, это означает, что JVM пересек весь путь к классу и не найден класс, на который вы пытались ссылаться. Решение, как это часто бывает в мире Java, чтобы проверить ваш classpath.
вы определяете путь к классу в командной строке, говоря java-cp а затем ваш classpath. В среде IDE, такой как Eclipse, у вас будет опция меню для указания пути к классам.
Предположим, у нас есть пакет под названием org.mypackage содержащие классов:
и файлы, определяющие этот пакет, хранятся физически в каталоге D:\myprogram (в Windows) или /home/user/myprogram (на Linux).
структура файла будет выглядеть этот:
Если вы знаете путь к классу или банку, содержащую класс, добавьте его в свой путь к классу во время его запуска. Вы можете использовать путь к классам, как указано здесь:
попробуйте это, если вы используете maven. Я использую maven для моего проекта и когда я делаю mvn clean install и попробуйте запустить программу, которая выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.
Я использую Eclipse IDE.
для класса не найдено исключение при запуске Junit test, попробуйте запустить mvn clean test раз. Он будет компилировать все тестовые классы.
использовать ‘;’ в качестве разделителя. Если переменные среды установлены правильно, вы должны увидеть свои настройки. Если ваш путь и путь к классам верны, windows должна распознать эти команды. Вам не нужно перезагружать компьютер при установке Java.
способы не работали для меня:
3) копирование jar в текущую папку проекта
4) Копирование jar в стандартное расположение Java jars (/usr/share/java)
это решение сообщается для класса com.mysql.интерфейс jdbc.Драйвер в mysql-connector-java.5-*.jar, работает на linux с OpenJDK версии 1.7
поднимитесь наверх и удалите оператор import, если он есть, и повторно импортируйте класс. Но если это не так, сделайте чистую, а затем постройте. Вы используете Netbeans или Eclipse?
Это может произойти, если ваш classpath не является правильным
давайте положим сериализуемый класс и десериализуемый класс под одним и тем же именем проекта. Вы запускаете сериализуемый класс, создавая сериализуемый объект в определенной папке. Теперь вам нужны дезариализованные данные. В то же время, если вы измените имя проекта не получится. Сначала необходимо запустить сериализуемый класс, а затем десериализовать файл.
Если вы используете maven попробуйте Maven обновить все проекты и принудительно для снимков. Он также очистит и перестроит весь путь к классам.. Это решило мою проблему..
1.Аннулировать кэш и перезапустить
2.восстановил мой проект который решил проблему
Это может произойти в Windows после обновления java, где отсутствует старая версия Java SDK и присутствует новая. Я бы проверил, использует ли ваша IDE установленную версию Java SDK (IntelliJ: CTRL + SHIFT + ALT + S)
Если вы добавили несколько (сторонние)**библиотеки и расширяет * * приложение класс
тогда это может произойти.
поместите весь код в блок try, а затем поймайте исключение в блоке catch
When I try running the program via:
Here are the things I’ve tried so far that don’t work:
adding inside my jar’s manifest> tag, the result is the same error as above
adding -Xbootclasspath/a:/usr/local/lib/libthrift.jar:./ to the java command line. it solves the first error but a different error comes up:
Exception in thread «main» java.lang.NoClassDefFoundError: org/apache/log4j/Logger at org.apache.thrift.transport.TServerSocket. (TServerSocket.java:36) at MyClass.start(Unknown Source) at MyClass.main(Unknown Source)
EDIT:
If I comment out the code that instantiates the missing classes but leave the imports, the code executes fine.
EDIT:
I moved my java classes to a server and referenced the MainClass with the server in the manifest attribute, but that didn’t fix anything.
7 Answers 7
The error seems actually related to your MANIFEST which:
The best solution when you have a jar is to try to include the required jars into the manifest declaration.
If your main class is in the default package (the unnamed package), I am not sure it can be referenced by the loader (see this SO question)
So move your JarRunner into a package, and declare it appropriately in the element.
Alternatively, use Maven, it’s loads better at this kind of stuff!
You had given answer yourself 🙂 add all the jars to your runtime classpath.As you said earlier *.jar solved one problem but loggers are not able to find out, so add log4j.jar to the path. Basically the idea is add all the jars required for running in to classpath.
The command line options for java can be found here.
I would test that you have you have located all your dependencies with a command like this:
Note that the compiler may successfully compile your classes even if all the classes that might be required at runtime are not present. Compilation will succeed if the direct dependencies of your classes are present. The dependencies of your dependencies are not necessary to create the binary and the compiler will not inspect them needlessly.
The message about org/apache/log4j/Logger suggests that you have a missing dependency on log4j. It will be necessary to add this library to the classpath. Check the documentation for the Thrift library to determine its dependencies.