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

106

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

java.lang.ClassNotFoundException:

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

user2426316
источник
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, у вас будет опция меню для указания пути к классам.

user2000590
источник
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, содержащий ваш класс, в путь сборки, тогда он должен работать нормально.

invictvs1
источник
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.

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

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

батат
источник
2

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

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

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

Омар Фарок Аник
источник
2

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

Ибрахимгунес
источник
2

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

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

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

Jyoti JK
источник
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)

s5s
источник
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