Як вирішити ClassNotFoundException?


106

Я намагаюся запустити програму Java, але отримую цю помилку:

java.lang.ClassNotFoundException:

Після двокрапки відбувається місце класу, якого немає. Однак я знаю, що такого місцезнаходження не існує, оскільки клас знаходиться в іншому місці. Як я можу оновити шлях до цього класу? Чи має це щось спільне з класовим шляхом?


1
Ви повинні додати банку, у якої відсутній клас, до classptah
Crom

якщо ваш клас має пакет, тоді перейдіть до папки, що містить клас. наприклад, якщо пакет - це test 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

24
Ваше запитання не містить достатньо інформації, щоб надати більш специфічну відповідь. Розглянемо, додавши це.
Thorbjørn Ravn Andersen

Розв’язання залежності / невідповідності версій є дуже поширеною проблемою в основному у всіх програмних середовищах. Ми можемо сказати, що вся будь-яка програма коли-небудь займається вирішенням таких визначень ... питання завжди в тому, що / де це визначення та яку версію ви мали на увазі?
masterxilo

2
Я лише підкреслюю, що крім світу Java все програмне забезпечення веде боротьбу із тим, щоб знайти правильні версії залежностей. Я можу згадати dll-hell, менеджери пакетів, менеджери версій, весняні завантажувальні матеріали та контейнери docker як приклади цієї проблеми та можливі рішення. Чим більша частка іноземного коду, тим більша проблема.
masterxilo

@masterxilo Так, але це не обов'язково тут проблема, і ви можете гавкати неправильне дерево. Все, що можна сказати, - це те, що класний шлях порушено.
Thorbjørn Ravn Andersen

45

Класовий шлях - це список місць для завантаження класів.

Ці "місця" можуть бути або каталогами, або файлами jar.

Для каталогів JVM буде слідувати очікуваній схемі завантаження класу. Якщо у мене на своєму classpath є каталог C: / myproject / класів , і я намагаюся завантажити клас com.mycompany.Foo , він буде шукати в каталозі класів каталог, який називається com , а потім під цим каталогом, який називається mycompany , і нарешті, він буде шукати файл під назвою Foo.class у цьому каталозі.

У другому випадку для jar файлів він шукатиме файл jar для цього класу. Файл jar - це насправді лише колекція каталогів, як описано вище. Якщо ви розпакуєте файл jar, ви отримаєте купу каталогів та файлів класів, наступних за зразком.

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

C: / мійпроект / класи; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

JVM спробує спочатку шукати класи каталогів , потім в stuff.jar і нарешті в otherstuff.jar .

Коли ви отримуєте ClassNotFoundException, це означає, що JVM пройшов весь класний шлях і не знайшов клас, на який ви намагалися посилатися. Рішення, як це часто трапляється в світі Java, - перевірити свій класний шлях.

Ви визначаєте класний шлях у командному рядку, кажучи java -cp, а потім ваш classpath. У 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та намагаюся запускати програму, це викидає виняток. Отже, я прибираю проект і запускаю його знову, і він працює на мене.

Я використовую IDE затемнення.

Для класу Не знайдено виняток під час запуску тесту Junit, спробуйте запустити mvn clean testодин раз. Він складе всі тестові класи.


в якому каталозі ви знаходилися, коли проводили "mvn clean test"? це в тому ж каталозі, що і POM?
TacoB0t

1
Так. Перемістіть його з каталогу, де присутній файл pom.
Арун

3

Щоб додати місце розташування класу до вашого класного шляху за допомогою командного рядка, просто додайте -cpабо -classpathта місце розташування класу під час його запуску. IE

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

Або якщо ви використовуєте IDE, такий як eclipse, ви можете клацнути правою кнопкою миші на project -> build path -> configure build path і додати зовнішній JAR, що містить ваш клас, до шляху збирання, тоді він повинен працювати нормально.


3

Використовувати ';' як роздільник. Якщо змінні середовища встановлені правильно, ви повинні побачити свої настройки. Якщо ваш PATH та CLASSPATH правильний, Windows повинен розпізнавати ці команди. НЕ потрібно перезавантажувати комп’ютер під час встановлення Java.


5
Тобто на windows (крапка з комою), на unix / linux це ':' (двокрапка)
Joeblade

3

Додайте повний шлях файлу jar до CLASSPATH. У Linux використання: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Іншим способом (без редагування CLASSPATH) було розпакування баночки в поточній папці проекту.

Способи не спрацювали для мене:

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


Лише розпакування JAR працювало на мене, жодне з інших рішень не робило
OverCoder

2

Перейдіть до верху та видаліть оператор імпорту, якщо такий є, та повторно імпортуйте клас. Але якщо це не так, робіть чисте, тоді будуйте. Використовуєте Netbeans або Eclipse?


2

Я також наткнувся на це і спробував усі інші рішення. У мене не було файлу .class у моїй папці HTML, у мене був лише файл .java. Після того, як я додав файл .class, програма добре працювала.


2
  1. Це може статися, якщо ваш класний шлях неправильний

  2. Поставимо клас серіалізаційного та десяриалізаційного класу під одним іменем проекту. Ви запускаєте клас серіалізації, створюючи об’єкт, що серіалізується, у певній папці. Тепер вам потрібні десяариалізовані дані. Тим часом, якщо ви зміните назву проекту, він не спрацює. Спершу потрібно запустити клас серіалізації, а потім деріаріалізувати файл.


2

Якщо ви використовуєте maven, спробуйте оновити всі проекти та примусити робити знімки. Він також очистить і відновив усі класні шляхи .. Це вирішило мою проблему ..


2

я тільки що зробив

1.Затвердити кеші та перезапустити

2. Перебудував мій проект, який вирішив проблему


1

Я намагався запустити .jar з коду C # за допомогою Processкласу. Ява-код успішно запускався від eclipse, але це не з візуальної студії C # і навіть натискаючи безпосередньо на файл jar, він завжди зупинявся за ClassNotFoundException:винятком. Моє рішення - експорт програми java як "Runnable JAR file" замість "JAR File". Сподіваюся, це може комусь допомогти.


1

Це може статися в Windows після оновлення Java, де відсутня стара версія SDK для Java та нова. Я би перевірив, чи використовує ваш 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 створює ту ж помилку. Також не забудьте мати папку бін Java (JDK / JRE) у патрії змінних середовищ операційної системи. (Шукайте докладніші відомості про інші повідомлення про це).


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

У моєму випадку клас, кинутий як клас не знайдений виняток, має властивості, пов'язані з сертифікатами ssl. Закрийте затемнення і відкрийте "Запустити як адміністратор", після чого проблему вирішено. Оскільки затемнення видає відповідний дозвіл, воно викине такий виняток.


-7

Покладіть увесь код у блок "Блоки", а потім виберіть виняток у "блок"

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

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