Как мне разрешить ClassNotFoundException?
Я пытаюсь запустить приложение Java, но получаю эту ошибку:
java.lang.ClassNotFoundException:
После двоеточия указывается местоположение пропавшего класса. Тем не менее, я знаю, что это местоположение не существует, так как класс находится в другом месте. Как я могу обновить путь этого класса? Это как-то связано с путем к классу?
29 ответов
Ваш путь к классам не работает (что является очень распространенной проблемой в мире Java).
В зависимости от того, как вы запускаете приложение, вам нужно изменить аргумент на -cp
, ваша запись Class-Path в MANIFEST.MF или ваш дисковый макет.
Путь к классам - это список мест для загрузки классов.
Эти "местоположения" могут быть либо каталогами, либо файлами jar.
Для каталогов JVM будет следовать ожидаемой схеме загрузки класса. Если у меня есть каталог C:/myproject/classes в моем classpath, и я пытаюсь загрузить класс com.mycompany.Foo, он будет искать в каталоге классов каталог с именем com, затем в этом каталоге с именем mycompany, и наконец, он будет искать файл с именем Foo.class в этом каталоге.
Во втором случае для jar-файлов он будет искать jar-файл для этого класса. JAR-файл на самом деле представляет собой просто упакованную в каталог папку, как указано выше. Если вы разархивируете файл jar, вы получите кучу каталогов и файлов классов, следуя приведенному выше шаблону.
Таким образом, JVM пересекает путь к классам от начала до конца, ища определение класса, когда пытается загрузить определение класса. Например, в пути к классам:
C: / MyProject / классы;C:/myproject/lib/stuff.jar;C:/myproject/lib/otherstuff.jar
JVM будет пытаться сначала искать в классах каталога, затем в stuff.jar и, наконец, в otherstuff.jar.
Когда вы получаете ClassNotFoundException, это означает, что JVM обошла весь путь к классу и не нашла класс, на который вы пытались сослаться. Решение, как это часто бывает в мире Java, заключается в проверке вашего пути к классам.
Вы определяете classpath в командной строке, говоря java -cp, а затем ваш classpath. В IDE, такой как Eclipse, у вас будет опция меню для указания вашего пути к классу.
Это лучшее решение, которое я нашел до сих пор.
Предположим, у нас есть пакет с именем org.mypackage
содержащий классы:
- HelloWorld (основной класс)
- SupportClass
- UtilClass
и файлы, определяющие этот пакет, физически хранятся в каталоге D:\myprogram
(в Windows) или /home/user/myprogram
(в Linux).
Структура файла будет выглядеть так:
Когда мы вызываем Java, мы указываем имя приложения для запуска: org.mypackage.HelloWorld
, Однако мы также должны указать Java, где искать файлы и каталоги, определяющие наш пакет. Итак, чтобы запустить программу, мы должны использовать следующую команду:
ПРИМЕЧАНИЕ: вы должны выполнить вышеуказанное
java
команда независимо от вашего текущего местоположения. Но это не так дляjavac
, Для компиляции вы можете даже напрямую перейти в каталог, где у вас есть.java
файлы и непосредственно выполнитьjavac ClassName.java
,
Если вы знаете путь к классу или jar-файл, содержащий класс, добавьте его в путь к классам во время его работы. Вы можете использовать classpath как упомянуто здесь:
в Windows
java -classpath .;yourjar.jar YourMainClass
в UNIX/Linux
java -classpath .:yourjar.jar YourMainClass
У меня была такая же ошибка, и мне потребовался целый день, чтобы понять, что это проблема конфликта зависимостей:
- Я импортировал две библиотеки, и;
- Оба и зависят от другой библиотеки, но разные версии
C
. Скажем, зависит от и зависит от; - использует класс, который существует только в;
- Однако в дереве зависимостей он «ближе», поэтому Maven использует для обоих
A
и даже не предупреждаю об этом (для меня это весьма поразительно); - В результате, когда пытается использовать класс, который существует только в,
ClassNotFoundException
брошен;
А вот что странно: если вы перемещаетесь по коду
B
в вашей среде IDE и попробуйте перейти к классу, который существует только в, он работает правильно. действительно установлен, и ваша IDE знает об этом, но при запуске приложения он просто игнорируется.
Это действительно свело меня с ума ...
В итоге мне пришлось добавить
C 2.0
к моему
pom.xml
чтобы его можно было выбрать вместо
C 1.0
.
Пожалуйста, обратитесь к этому сообщению, чтобы узнать, как Maven выбирает ближайшую зависимость: /questions/11319791/neskolko-versij-odnoj-i-toj-zhe-zavisimosti-v-maven/56487699#56487699
Вы можете использовать
mvn dependency:tree
для визуализации дерева зависимостей.
Основной Общий Вопрос - Простейший Общий Ответ;)
Учитывая информацию, я сделаю предположение, что вы, возможно, пытаетесь использовать базовый подход к кодированию, сборке / компиляции и запуску простого консольного приложения, такого как "Hello World", с использованием простого текстового редактора и некоторой командной оболочки.
Эта ошибка возникает в следующем сценарии:
..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
Другими словами, используйте:
..\SomePath>java HelloWorld
PS Добавление расширения файла.class производит ту же ошибку. Также убедитесь, что папка bin Java (JDK/JRE) находится в переменной PATH среды переменных операционной системы (подробности см. В других публикациях по этому вопросу). PPS Был ли я прав в своих предположениях?
Если вы используете maven, убедитесь, что у вас есть этот плагин в вашем pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!-- Attach the shade goal into the package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Это поместит вашу зависимость (причину исключения) в вашу банку.
FYI: это будет включать все зависимости, завышенные в последней банке
Добавьте полный путь к файлу JAR в CLASSPATH. В Linux использовать: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
, Другой способ (без редактирования CLASSPATH) - разархивировать jar в папке текущего проекта.
Пути не сработали для меня:
1) Использование -cp
вариант с полным путем файла JAR.
2) Использование -cp
только с именем jar, когда находится в текущей папке
3) Копирование банки в папку текущего проекта
4) Копирование фляги в стандартное местоположение фляг java (/usr/share/java)
Об этом решении сообщается для класса com.mysql.jdbc.Driver в mysql-connector-java.5-*. Jar, работающем под Linux с OpenJDK версии 1.7.
Попробуйте это, если вы используете Maven. Я использую Maven для своего проекта и когда я делаю mvn clean install
и попробуйте запустить программу, она выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.
Я использую Eclipse IDE.
Для исключения Class Not Found при запуске теста Junit попробуйте запустить mvn clean test
один раз. Это скомпилирует все тестовые классы.
Это может произойти в Windows после обновления Java, когда старая версия Java-SDK отсутствует и присутствует новая. Я бы проверил, использует ли ваша IDE установленную версию Java SDK (IntelliJ: CTRL + SHIFT + ALT + S)
Чтобы добавить местоположение класса в ваш путь к классу через командную строку, просто добавьте -cp
или же -classpath
и местоположение класса во время его работы. IE
java -cp "c:/location/of/file" YourProgram
Или, если вы используете IDE, например Eclipse, вы можете щелкнуть правой кнопкой мыши на project -> build path -> configure build path
и добавьте внешний JAR-файл, содержащий ваш класс, в путь сборки, тогда он должен работать нормально.
Используйте ';' в качестве разделителя. Если ваши переменные среды установлены правильно, вы должны увидеть ваши настройки. Если ваш PATH и CLASSPATH верны, окна должны распознавать эти команды. Вам не нужно перезагружать компьютер при установке Java.
Стоит отметить, что иногда Java лжет о классе, который вызывает проблему.
Вы можете получить эту ошибку, если java пытается загрузить класс A, который зависит от класса B, а класс B не может быть загружен.
В некоторых случаях java сообщает, что класс A не может быть загружен, когда проблема связана с B.
Насколько я помню, в последний раз это происходило, когда класс A включал статическое поле или статический инициализатор, который загружал класс B.
Итак, после проверки правильности вашего пути к классу (я на самом деле выгружаю полный путь к классам при запуске), я затем делаю двоичную отбивку для класса A.
Под этим я подразумеваю, что я удаляю половину кода в A.
Если это все еще не удается, я удаляю другую половину и так далее, пока проблема (надеюсь, не исчезнет).
Я столкнулся с этим и попробовал все другие решения. У меня не было файла.class в моей папке HTML, у меня был только файл.java. После добавления файла.class программа работала нормально.
Я только что сделал
1. Недействительные кэши и перезапуск
2.Восстановить мой проект, который решил проблему
Если вы используете maven, попробуйте maven обновить все проекты и принудительно сделать снимки. Это также очистит и восстановит все пути к классам.. Это решило мою проблему..
Это может произойти, если ваш путь к классу неверен
Давайте установим сериализуемый класс и десериализуемый класс под тем же именем проекта. Вы запускаете сериализуемый класс, создавая сериализуемый объект в определенной папке. Теперь вам нужны десериализованные данные. В то же время, если вы измените название проекта, он не будет работать. Сначала вы должны запустить сериализуемый класс, а затем десериализовать файл.
Поднимитесь наверх и удалите оператор импорта, если он есть, и повторно импортируйте класс. Но если это не так, сделайте чистку, затем соберите. Вы используете Netbeans или Eclipse?
Я пытался запустить.jar из кода C#, используя Process
учебный класс. Java-код успешно запускался из eclipse, но не из C# visual studio и даже не щелкая непосредственно по файлу jar, он всегда останавливался на ClassNotFoundException:
исключение. Решением для меня был экспорт java-программы как "Runnable JAR-файл" вместо "JAR-файл". Надеюсь, это может кому-то помочь.
Если вы добавили несколько (сторонних)** библиотек и расширений ** Класс приложения
Тогда это может произойти.
Для этого вы должны установить multiDexEnabled true
и заменить ваш расширенный Application
класс с MultiDexApplication
,
Это будет решено.
Если вы переместили свой проект на новый компьютер или импортировали его из git, попробуйте это.
- Щелкните правой кнопкой мыши класс> Запуск от имени> Выполнить конфигурацию
- удалить ссылку на основной класс
- Применить> Закрыть
- Теперь снова щелкните правой кнопкой мыши класс> запустить как приложение java.
У меня это сработало.
В моем случае класс, выброшенный как исключение class not found, имеет свойства, связанные с сертификатами ssl. Закройте затмение и откройте с помощью "Запуск от имени администратора", после чего проблема будет решена. Поскольку у eclipse есть разрешение, связанное с проблемой, оно вызовет такое исключение.
Я запустил код Java в Терминале, и добавление пути к классу было таким решением:
> java -cp <JAR file> <JAVA Class file>
Например,
c:\code\prototype-app\target\classes>java -cp ..\prototype-app-1.0-SNAPSHOT.jar com_stree.app.DetectLabels
Моя среда выполнения:
ОС: Windows 10
JAVA: 15.0.1
Maven: 3.8.1
В моем случае я использую Spring Tool Suite 4, и моя проблема была решена, выполнив два шага:
- Щелкните правой кнопкой мыши проект -> Запустить от имени -> Очистить Maven.
- Щелкните правой кнопкой мыши проект -> Запустить от имени -> Установка Maven.
Затем я мог бы запустить проект с помощью: «Запуск от имени» -> Spring Boot App.
Надеюсь, это кому-то поможет :)
Проверьте права доступа к файлу .jar или .class. У меня была банка в библиотеке проекта с разрешения-rw-r--r--
и я изменил его на-rw-rw-r--
использование в Linux:
chmod 664 <.jar>
Одна библиотека звонилаClassLoader.loadClass
который запустил ошибку при загрузке класса в банку с неправильным разрешением.
У меня возникла эта проблема после обновления подключаемого модуля "Java Language Support" из Visual Studio Code с версии 0.66.0 до 0.67.0.
Возврат к предыдущей версии позволил мне запустить тот же код без каких-либо проблем.
извините, я опаздываю с вопросом, но я объясню вам это на простейшем языке непрофессионала. Когда вы набираете 'javac <programname.java> Компилятор проверяет программу и находит ошибки, прежде всего убедитесь, что ваша программа находится в том же каталоге, что и вы выполнили в командной строке. Затем он создает. Файл класса вашей программы. Например, Если имя моей программы было Test.java, тогда созданный файл класса должен быть Test.class, который будет выполнен в следующей строке. Иногда java берет другое имя для вашего .class, используйте это имя и вуаля вы получите результат.
Я удалил некоторые неиспользуемые импортированные файлы, и это устранило проблему. Вы не можете не найти Класс, если никогда не будете его искать.
Поместите весь код в блок try, а затем перехватите исключение в блоке catch
try
{
// code
}
catch(ClassNotFoundException e1)
{
e1.getmessage();
}