Вопрос-ответ

How do I resolve ClassNotFoundException?

Как мне разрешить ClassNotFoundException?

Я пытаюсь запустить Java-приложение, но получаю эту ошибку:

java.lang.ClassNotFoundException:

После двоеточия указывается местоположение отсутствующего класса. Однако я знаю, что это местоположение не существует, поскольку класс расположен в другом месте. Как я могу обновить путь к этому классу? Это как-то связано с путем к классу?

Переведено автоматически
Ответ 1

Путь к классу - это список местоположений для загрузки классов.

Эти "местоположения" могут быть либо каталогами, либо файлами jar.

Для каталогов JVM будет следовать ожидаемому шаблону загрузки класса. Если у меня есть каталог C:/myproject/classes в моем пути к классу, и я пытаюсь загрузить класс com.mycompany.Foo, он будет искать в каталоге classes каталог с именем com, затем в нем каталог с именем mycompany и, наконец, он будет искать файл с именем Foo.class в этом каталоге.

Во втором случае для файлов jar будет выполняться поиск в файле jar этого класса. Файл jar на самом деле представляет собой просто сжатую коллекцию каталогов, подобных приведенной выше. Если вы распакуете файл jar, вы получите кучу каталогов и файлов классов, следуя приведенному выше шаблону.

Таким образом, JVM проходит путь к классу от начала до конца в поисках определения класса, когда пытается загрузить определение класса. Например, в classpath :

C:/myproject/classes;C:/myproject/lib/stuff.jar;C:/myproject/lib/otherstuff.jar

JVM попытается сначала заглянуть в каталог classes, затем в stuff.jar и, наконец, в otherstuff.jar.

Когда вы получаете ClassNotFoundException , это означает, что JVM прошла весь путь к классу и не нашла класс, на который вы пытались сослаться. Решение, как это часто бывает в мире Java, заключается в проверке вашего пути к классу.

Вы определяете путь к классу в командной строке, произнося java -cp, а затем свой путь к классу. В IDE, такой как Eclipse, у вас будет опция меню для указания вашего пути к классу.

Ответ 2

Ваш путь к классу нарушен (что является очень распространенной проблемой в мире Java).

В зависимости от того, как вы запускаете свое приложение, вам нужно изменить аргумент на -cp, запись пути к классу в MANIFEST.MF или макет вашего диска.

Ответ 3

Это лучшее решение, которое я нашел на данный момент.

Предположим, у нас есть пакет с именем org.mypackage, содержащий классы:


  • HelloWorld (основной класс)

  • SupportClass

  • UtilClass

и файлы, определяющие этот пакет, физически хранятся в каталоге D:\myprogram (в Windows) или /home/user/myprogram (в Linux).

Структура файла будет выглядеть следующим образом: введите описание изображения здесь

Когда мы вызываем Java, мы указываем имя приложения для запуска: org.mypackage.HelloWorld. Однако мы также должны указать Java, где искать файлы и каталоги, определяющие наш пакет. Итак, чтобы запустить программу, мы должны использовать следующую команду: введите описание изображения здесь


ПРИМЕЧАНИЕ: Вы должны выполнить приведенную выше java команду независимо от вашего текущего местоположения. Но это не относится к javac. Для компиляции вы даже можете напрямую зайти в каталог, где у вас есть ваши .java файлы, и напрямую выполнить javac ClassName.java.


Ответ 4

Если вы знаете путь к классу или банку, содержащую класс, добавьте его в свой classpath во время его запуска. Вы можете использовать classpath, как указано здесь:

в Windows

java -classpath .;yourjar.jar YourMainClass

в UNIX / Linux

java -classpath .:yourjar.jar YourMainClass
java class