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


106

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

java.lang.ClassNotFoundException:

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


1
Вы должны добавить банку с отсутствующим классом в classptah
Crom

если у вашего класса есть пакет, перейдите в папку, содержащую класс. например, если пакет - package test.abc, то перед тестом перейдите в папку и выполните java -cp. test.abc.CLASSNAME (без .class). Если пакета нет, перейдите в папку, содержащую класс, и скажите java -cp. CLASSNAME
Необязательно

Либо класс не был развернут в вашей среде выполнения (например, отсутствует jar), либо класс не отображается в данном загрузчике классов, проверьте этот инструмент, который помогает устранять эти проблемы: jhades.org
Angular University

1
Я тоже иногда сталкиваюсь с этим. Это исключение явно нарушает правило указания всего необходимого контекста в сообщении об исключении. Следует упомянуть, где он пытался найти вещь, что находится в вашем пути к классам. Пожалуйста, сделайте более качественные сообщения об исключениях. Не заставляйте нас искать информацию, которая может помочь решить проблему.
masterxilo

Ответы:


32

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

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


34
Не могли бы вы рассказать подробнее о затмении? Что мне нужно сделать?
user2426316 01

24
Ваш вопрос не содержит достаточно информации, чтобы дать более конкретный ответ. Подумайте о добавлении этого.
Thorbjørn Ravn Andersen

Несоответствие разрешения зависимостей / версий - очень распространенная проблема практически во всех средах программирования. Можно сказать, что все, что делает любая программа, - это разрешает такие определения ... вопрос всегда в том, что / где это определение и какую версию вы имели в виду?
masterxilo

2
Я просто подчеркиваю, что, помимо мира Java, все программы борются за то, чтобы найти правильные версии зависимостей. В качестве примеров этой проблемы и возможных решений я могу упомянуть dll-hell, менеджеры пакетов, менеджеры версий, спецификации весенней загрузки и контейнеры докеров. Чем больше доля стороннего кода, тем серьезнее становится проблема.
masterxilo

@masterxilo Да, но это не обязательно проблема, и вы можете лаять не на то дерево. Все, что можно сказать, это то, что путь к классам нарушен.
Торбьорн Равн Андерсен

45

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

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

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

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

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

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

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

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

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


13

Это лучшее решение, которое я нашел до сих пор.

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

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

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

Файловая структура будет выглядеть так: введите описание изображения здесь

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

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


6

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

в Windows

java -classpath .;yourjar.jar YourMainClass

в UNIX / Linux

java -classpath .:yourjar.jar YourMainClass

4

Попробуйте это, если вы используете maven. Я использую maven для своего проекта, и когда я это делаю mvn clean installи пытаюсь запустить программу, она выдает исключение. Итак, я очищаю проект и запускаю его снова, и он работает для меня.

Я использую eclipse IDE.

Для исключения класса не найден при запуске теста Junit попробуйте запустить его mvn clean testодин раз. Он скомпилирует все тестовые классы.


в каком каталоге вы были, когда запускали "mvn clean test"? находится ли он в том же каталоге, что и POM?
TacoB0t

1
Да. Запустите его из каталога, в котором находится файл pom.
Arun

3

Чтобы добавить расположение класса в путь к классам через командную строку, просто добавьте -cpили -classpathи расположение класса при его запуске. IE

java -cp "c:/location/of/file" YourProgram

Или, если вы используете IDE, такую ​​как eclipse, вы можете щелкнуть правой кнопкой мыши project -> build path -> configure build path и добавить внешний JAR, содержащий ваш класс, в путь сборки, тогда он должен работать нормально.


3

Используйте ';' как разделитель. Если переменные среды установлены правильно, вы должны увидеть свои настройки. Если ваши PATH и CLASSPATH верны, окна должны распознавать эти команды. Вам НЕ нужно перезагружать компьютер при установке Java.


5
То есть в окнах (точка с запятой), в unix / linux это ':' (двоеточие)
Joeblade

3

Добавьте полный путь к файлу jar в CLASSPATH. В Linux используют:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH" . Другой способ (без редактирования CLASSPATH) - разархивировать банку в текущей папке проекта.

У меня не работали способы:

1) Использование -cpопции с полным путем к файлу jar.

2) Использование -cpтолько с именем jar, если оно находится в текущей папке

3) Копирование баночки в папку текущего проекта

4) Копирование jar-файла в стандартное расположение java-файлов (/ usr / share / java)

Об этом решении сообщается для класса com.mysql.jdbc.Driver в mysql-connector-java.5 - *. Jar, работающем в Linux с OpenJDK версии 1.7.


У меня сработало только разархивирование JAR, ни одно из других решений
OverCoder

2

Поднимитесь наверх и удалите оператор импорта, если он есть, и повторно импортируйте класс. Но если это не так, выполните чистку, а затем сборку. Вы используете Netbeans или Eclipse?


2

Я тоже столкнулся с этим и попробовал все другие решения. У меня не было файла .class в моей папке HTML, у меня был только файл .java. Как только я добавил файл .class, программа заработала нормально.


2
  1. Это может произойти, если ваш путь к классам неверен

  2. Давайте поместим сериализуемый класс и десериализуемый класс под одним и тем же именем проекта. Вы запускаете сериализуемый класс, создавая сериализуемый объект в определенной папке. Теперь вам нужны обезвреженные данные. А пока если вы измените название проекта, он не сработает. Сначала вам нужно запустить сериализуемый класс, а затем десериализовать файл.


2

Если вы используете maven, попробуйте обновить все проекты maven и создать моментальные снимки. Он также очистит и перестроит весь путь к классам .. Это решило мою проблему ..


2

я только что сделал

1.Проверьте кеши и перезапустите

2. Восстановил мой проект, который решил проблему.


1

Я пытался запустить .jar из кода C # с помощью Processкласса. Код java успешно запускался из eclipse, но не из Visual Studio C #, и даже при прямом нажатии на файл jar он всегда останавливался с ClassNotFoundException:исключением. Решение для меня заключалось в экспорте Java-программы как «Runnable JAR file» вместо «JAR File». Надеюсь, это поможет кому-то.


1

Это может произойти в Windows после обновления java, где старая версия java SDK отсутствует, а новая присутствует. Я бы проверил, использует ли ваша IDE установленную версию java SDK (IntelliJ: CTRL + SHIFT + ALT + S)


1

Если вы добавили несколько (сторонних) ** библиотек и расширяет ** класс приложения

Тогда это могло произойти.

Для этого вам нужно установить multiDexEnabled trueи заменить свой расширенный Applicationкласс на MultiDexApplication.

Это будет решено.


1

Основной общий вопрос - простейший общий ответ;)

Учитывая информацию, я сделаю предположение, что вы можете попробовать базовый подход к кодированию, построению / компиляции и запуску простого консольного приложения, такого как «Hello World», используя простой текстовый редактор и некоторую командную оболочку.

Эта ошибка возникает в следующем сценарии:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

Другими словами, используйте:

..\SomePath>java HelloWorld

PS Добавление расширения файла .class вызывает ту же ошибку. Также убедитесь, что папка bin Java (JDK / JRE) находится в PATH переменных среды операционной системы. (Дополнительные сведения см. В других публикациях по этому поводу) PPS Правильно ли я высказал свое предположение / с?


1

Если вы используете 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 : это будет включать все зависимости, завышенные в последней банке


@Archit добавил.
techkuz

0

В моем случае класс, выброшенный как исключение class not found, имеет свойства, связанные с сертификатами ssl. Закройте eclipse и откройте с помощью «Запуск от имени администратора», после чего проблема будет решена. Поскольку у eclipse есть разрешение, связанное с проблемой, оно вызовет такое исключение.


-8

Поместите весь код в блок try, затем перехватите исключение в блоке catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
Это не устраняет исключение. Это скрывает исключение. Кроме того, «e1.getmessage ()» - это а) неправильное использование заглавных букв в getMessage () и б) мало что нужно сделать, так как он возвращает строку с сообщением, а вы не печатаете ее, не регистрируете ее или что-то еще!
IBBoard
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.