Как мне разрешить 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 обновить все проекты и принудительно сделать снимки. Это также очистит и восстановит все пути к классам.. Это решило мою проблему..

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

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

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

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

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

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

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

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

Если вы переместили свой проект на новый компьютер или импортировали его из git, попробуйте это.

  1. Щелкните правой кнопкой мыши класс> Запуск от имени> Выполнить конфигурацию
  2. удалить ссылку на основной класс
  3. Применить> Закрыть
  4. Теперь снова щелкните правой кнопкой мыши класс> запустить как приложение 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, и моя проблема была решена, выполнив два шага:

  1. Щелкните правой кнопкой мыши проект -> Запустить от имени -> Очистить Maven.
  2. Щелкните правой кнопкой мыши проект -> Запустить от имени -> Установка 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();
}
Другие вопросы по тегам