Что означает «Не удалось найти или загрузить основной класс»?

1099

Общей проблемой, которую испытывают новые разработчики Java, является то, что их программы не запускаются с сообщением об ошибке: Could not find or load main class ...

Что это значит, что его вызывает, и как его исправить?

  • 29
    Пожалуйста, обратите внимание, что это вопрос с «самостоятельным ответом», предназначенный для общих справочных вопросов и ответов для новых пользователей Java. Я не смог найти существующие вопросы и ответы, которые бы адекватно освещали это (ИМО).
Теги:
class
main

48 ответов

1027
Лучший ответ

Синтаксис команды java <class-name>

Прежде всего, вам необходимо понять, как правильно запустить программу с помощью команды java (или javaw).

Обычный синтаксис 1 таков:

    java [ <option> ... ] <class-name> [<argument> ...]

где <option> - это параметр командной строки (начинающийся с символа "-"), <class-name> - это полное имя класса Java, а <argument> - произвольный аргумент командной строки, который передается вашему приложению.
1 - есть второй синтаксис для "исполняемых" JAR файлов, который я опишу внизу.

Полное имя (FQN) для класса обычно пишется так же, как в исходном коде Java; например

    packagename.packagename2.packagename3.ClassName

Однако некоторые версии команды java позволяют использовать косые черты вместо точек; например

    packagename/packagename2/packagename3/ClassName

который (сбивает с толку) выглядит как путь к файлу, но не один. Обратите внимание, что термин "полностью определенное имя" - это стандартная терминология Java... я не просто придумал, чтобы сбить вас с толку :-)

Вот пример того, как должна выглядеть команда java:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

Вышеуказанное заставит команду java сделать следующее:

  1. Найдите скомпилированную версию класса com.acme.example.ListUsers.
  2. Загрузите класс.
  3. Убедитесь, что в классе есть метод main с сигнатурой, типом возвращаемого значения и модификаторами, заданными public static void main(String[]). (Обратите внимание, что имя аргумента метода НЕ является частью подписи.)
  4. Вызовите этот метод, передав ему аргументы командной строки ("fred", "joe", "bert") в виде String[].

Причины, по которым Java не может найти класс

Когда вы получаете сообщение "Не удалось найти или загрузить основной класс...", это означает, что первый шаг не выполнен. Команда java не смогла найти класс. И действительно, "..." в сообщении будет полностью определенным именем класса, которое ищет java.

Так почему же он не может найти класс?

Причина № 1 - вы ошиблись с аргументом имени класса

Первой вероятной причиной является то, что вы, возможно, указали неправильное имя класса. (Или... правильное имя класса, но в неправильной форме.) Рассматривая приведенный выше пример, можно привести множество неправильных способов указания имени класса:

  • Пример № 1 - простое имя класса:

    java ListUser
    

    Когда класс объявлен в пакете, таком как com.acme.example, вы должны использовать полное имя класса, включая имя пакета в команде java; например

    java com.acme.example.ListUser
    
  • Пример №2 - имя файла или путь, а не имя класса:

    java ListUser.class
    java com/acme/example/ListUser.class
    
  • Пример № 3 - имя класса с неправильным регистром:

    java com.acme.example.listuser
    
  • Пример № 4 - опечатка

    java com.acme.example.mistuser
    
  • Пример № 5 - исходное имя файла

    java ListUser.java
    
  • Пример №6 - вы полностью забыли имя класса

    java lots of arguments
    

Причина № 2 - неверно указан путь к классу приложения

Вторая вероятная причина состоит в том, что имя класса является правильным, но команда java не может найти класс. Чтобы понять это, вам необходимо понять концепцию "classpath". Это хорошо объясняется документацией Oracle:

Итак... если вы правильно указали имя класса, то следует проверить, правильно ли вы указали путь к классам:

  1. Прочитайте три документа, ссылки на которые приведены выше. (Да... ПРОЧИТАЙТЕ их. Важно, чтобы программист Java понимал, по крайней мере, основы того, как работают механизмы пути классов Java.)
  2. Посмотрите на командную строку и/или переменную среды CLASSPATH, которая действует, когда вы запускаете команду java. Проверьте правильность имен каталогов и файлов JAR.
  3. Если в пути к классам есть относительные имена путей, проверьте, правильно ли они разрешаются... из текущего каталога, действующего при запуске команды java.
  4. Убедитесь, что класс (упомянутый в сообщении об ошибке) может быть расположен на эффективном пути к классам.
  5. Обратите внимание, что синтаксис пути к классам отличается для Windows по сравнению с Linux и Mac OS. (Сепаратор пути к классам ; на Windows, и : на других Если вы используете неправильный разделитель для вашей платформы, вы не получите сообщение об ошибке явного Вместо этого, вы получите несуществующий файл или каталог на пути, который будет.. молча игнорируется.)

Причина № 2а - неправильный каталог находится на пути к классам

Когда вы помещаете каталог в путь к классам, он условно соответствует корню квалифицированного пространства имен. Классы расположены в структуре каталогов под этим корнем, сопоставляя полное имя с путевым именем. Так, например, если "/usr/local/acme/classes" находится в пути к классу, то, когда JVM ищет класс с именем com.acme.example.Foon, она будет искать файл ".class" с этим путь к файлу:

  /usr/local/acme/classes/com/acme/example/Foon.class

Если бы вы поместили "/usr/local/acme/classes/com/acme/example" в путь к классам, то JVM не сможет найти класс.

Причина № 2b - путь к подкаталогу не соответствует FQN

Если FQN ваших классов - com.acme.example.Foon, то JVM будет искать "Foon.class" в каталоге "com/acme/example":

  • Если ваша структура каталогов не соответствует именам пакетов, как показано выше, JVM не найдет ваш класс.

  • Если вы попытаетесь переименовать класс, переместив его, это тоже не удастся... но трассировка стека исключений будет другой.

Чтобы привести конкретный пример, предположим, что:

  • вы хотите запустить класс com.acme.example.Foon,
  • полный путь к файлу /usr/local/acme/classes/com/acme/example/Foon.class,
  • ваш текущий рабочий каталог - /usr/local/acme/classes/com/acme/example/,

затем:

# wrong, FQN is needed
java Foon

# wrong, there is no 'com/acme/example' folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Заметки:

  • Опция -classpath может быть сокращена до -cp в большинстве выпусков Java. Проверьте соответствующие ручные записи для java, javac и так далее.
  • Тщательно продумайте выбор между абсолютными и относительными путями в classpath. Помните, что относительный путь может "сломаться", если текущий каталог изменится.

Причина № 2c - зависимости отсутствуют в пути к классам

Путь к классам должен включать все другие (не системные) классы, от которых зависит ваше приложение. (Системные классы располагаются автоматически, и вам редко нужно беспокоиться об этом.) Для корректной загрузки основного класса JVM должна найти:

(Примечание: спецификации JLS и JVM позволяют некоторой области для JVM загружать классы "лениво", и это может повлиять, когда выдается исключение загрузчика классов.)

Причина № 3 - класс был объявлен в неправильной упаковке

Иногда случается, что кто-то помещает файл исходного кода в неправильную папку в своем дереве исходного кода, или они package объявление package. Если вы сделаете это в IDE, компилятор IDE немедленно сообщит вам об этом. Точно так же, если вы используете достойный инструмент для сборки Java, он будет запускать javac таким образом, чтобы выявлять проблему. Однако, если вы создаете свой Java-код вручную, вы можете сделать это таким образом, чтобы компилятор не заметил проблему, и полученный файл ".class" оказался не там, где вы ожидаете.

Все еще не можете найти проблему?

Есть много вещей, которые можно проверить, и что-то легко пропустить. Попробуйте добавить -Xdiag в командную строку java (как первое после java). Он будет выводить различные вещи о загрузке классов, и это может дать вам подсказки о том, какова реальная проблема.

Также рассмотрите возможные проблемы, вызванные копированием и вставкой невидимых или не-ASCII символов с веб-сайтов, документов и так далее. И рассмотрим "гомоглифы", если две буквы или символы выглядят одинаково... но это не так.


java -jar <jar file>

Альтернативный синтаксис, используемый для "исполняемых" файлов JAR, выглядит следующим образом:

  java [ <option> ... ] -jar <jar-file-name> [<argument> ...]

например

  java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

В этом случае имя класса точки входа (т.е. com.acme.example.ListUser) и com.acme.example.ListUser классу указываются в MANIFEST файла JAR.


Иды

Типичная среда Java IDE поддерживает запуск приложений Java в самой JVM IDE или в дочерней JVM. Они, как правило, защищены от этого конкретного исключения, поскольку в среде IDE используются собственные механизмы для создания пути к классам среды выполнения, определения основного класса и создания командной строки java.

Однако это исключение по-прежнему возможно, если вы делаете что-то за спиной IDE. Например, если вы ранее настроили Application Launcher для своего Java-приложения в Eclipse, а затем переместили файл JAR, содержащий класс "main", в другое место файловой системы, не сообщая Eclipse, Eclipse невольно запустит JVM с неправильным путем к классу.

Короче говоря, если вы столкнулись с этой проблемой в IDE, проверьте наличие таких вещей, как устаревшее состояние IDE, неработающие ссылки на проекты или неработающие конфигурации запуска.

Для IDE также возможно просто запутаться. IDE - это чрезвычайно сложные части программного обеспечения, состоящие из множества взаимодействующих частей. Многие из этих частей используют различные стратегии кэширования, чтобы сделать среду IDE в целом отзывчивой. Иногда они могут пойти не так, и одним из возможных симптомов являются проблемы при запуске приложений. Если вы подозреваете, что это может произойти, стоит перезапустить вашу IDE.


Другие ссылки

  • 37
    У меня была эта проблема, когда я пытался запустить класс со сторонней библиотекой. Я вызвал Java следующим образом: java -cp ../third-party-library.jar com.my.package.MyClass ; это не работает, вместо этого необходимо также добавить локальную папку в путь к классу (разделенный : например: java -cp ../third-party-library.jar:. com.my.package.MyClass тогда это должно работать
  • 18
    После многих лет программирования на Java мне все же удалось оказаться на этой странице. Для меня проблема была в том, что синтаксис classpath зависит от ОС . Я новичок в программировании на Windows и понятия не имел.
Показать ещё 8 комментариев
211

Если ваше исходное кодовое имя HelloWorld.java, ваш скомпилированный код будет HelloWorld.class.

Вы получите эту ошибку, если вы ее вызываете, используя:

java HelloWorld.class

Вместо этого используйте это:

java HelloWorld
  • 3
    Проблема состоит в том, что это решение работает только для классов Java, объявленных в пакете по умолчанию без зависимостей файла JAR. (И даже тогда, не всегда.) Большинство программ на Java не так просты.
  • 1
    как сказал Стивен, это работает только с «пакетом по умолчанию», что означает отсутствие объявления пакета в верхней части файла. Для быстрого тестирования некоторого кода я сделал: javac TestCode.java за которым следует java TestCode
Показать ещё 6 комментариев
116

Если ваши классы находятся в пакетах, вы должны cd в основную директорию и запускаться с использованием полного имени класса (имя пакета .MainClassName).

Пример:

Мои классы находятся здесь:

D:\project\com\cse\

Полное имя моего основного класса:

com.cse.Main

Итак, я cd вернусь в основной каталог:

D:\project

Затем выполните команду java:

java com.cse.Main
  • 1
    Этот ответ делает целый ряд предположений. И есть другие способы добиться этого. Вместо того, чтобы слепо следовать приведенному выше совету, я бы порекомендовал людям потратить время на чтение ссылок в моем ответе, объясняющих, как работает путь к классам Java. Лучше ПОНИМАТЬ, что ты делаешь ...
43

Если вы определяете основной класс и основной метод в package, вы должны запустить его в иерархическом каталоге, используя полное имя класса (packageName.MainClassName).

Предположим, что существует файл исходного кода (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Для запуска этого кода вы должны поместить Main.Class в пакет, например, в каталог ./com/test/Main.Java. А в корневом каталоге используйте java com.test.Main.

  • 1
    Смотрите «Дополнительные примечания № 1» моего ответа. Для лучшего объяснения этой проблемы.
  • 11
    @StephenC Да, ваш ответ более полный (и, конечно, +1), но в этом конкретном ответе было слово «пакет», что позволило мне быстро найти то, что мне нужно. И это сработало. Итак +1 Разави. StephenC, у вас нет простого примера пакета, который мне нужен, так как я новичок в Java.
Показать ещё 3 комментария
38

Когда один и тот же код работает на одном ПК, но он показывает ошибку в другом, лучшее решение, которое я когда-либо находил, компилируется следующим образом:

javac HelloWorld.java
java -cp . HelloWorld
  • 1
    Это не очень хорошая рекомендация. Вы зависите от того, что переменная среды CLASSPATH не установлена или имеет значение, соответствующее значению «.». Да, это работает во многих случаях, но не будет в других.
  • 0
    Ну, конечно, javac -classpath . HelloWorld.java работал бы! И это лучшее решение в вашем случае.
Показать ещё 2 комментария
29

Что помогло мне указать путь к командной строке в командной строке, например:

  • Создайте новую папку, C:\temp

  • Создайте файл Temp.java в C:\temp, со следующим классом в нем:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  • Откройте командную строку в папке C:\temp и напишите следующую команду для компиляции класса Temp:

    javac Temp.java
    
  • Запустите скомпилированный Java-класс, добавив параметр -classpath, чтобы JRE знал, где найти класс:

    java -classpath C:\temp Temp Hello!
    
  • 2
    В Ubuntu мне также пришлось указать путь. Не понимаю, почему он не может использовать Текущий рабочий каталог по умолчанию. Я убежден, что Java спонсируется производителями клавиатур!
  • 1
    @ ушел - причина, по которой "." по умолчанию не находится в $ PATH, это ловушка безопасности. seas.upenn.edu/cets/answers/dot-path.html
Показать ещё 5 комментариев
24

В соответствии с сообщением об ошибке ( "Не удалось найти или загрузить основной класс" ) существуют две категории проблем:

  • Основной класс не может быть найден
  • Основной класс не может быть загружен (этот вопрос не полностью обсуждается в принятом ответе)

Основной класс не может быть найден при наличии опечатки или неправильного синтаксиса в имени полного класса или не существует в указанном пути к классам.

Основной класс не может быть загружен, когда класс не может быть инициирован, обычно основной класс расширяет другой класс и этот класс не существует в предоставленном пути к классам.

Например:

public class YourMain extends org.apache.camel.spring.Main

Если camel- spring не включен, эта ошибка будет сообщена.

  • 0
    «В основном» есть и много других категорий. И проблема с отсутствующим суперклассом - очень необычный случай. (Настолько необычно, что я никогда не видел это ... в вопросах, задаваемых на этом сайте.)
  • 0
    Есть два, потому что ошибка говорит «Не удалось найти или загрузить основной класс». Если есть другие категории, пожалуйста, сообщите мне. Я видел это, поэтому просто хочу поделиться этим здесь, может быть, кому-то еще это понадобится.
Показать ещё 9 комментариев
13

У меня была такая ошибка в этом случае:

java -cp lib.jar com.mypackage.Main

Он работает с ; для Windows и : для Unix:

java -cp lib.jar; com.mypackage.Main
  • 0
    Да. Скорее всего, потому что вашего Main нет в файле JAR. -cp lib.jar; означает то же самое, что и -cp lib.jar;. т.е. текущий каталог включен в classpath.
  • 0
    Наконец-то исправлена проблема с unix .. спасибо (работает с :)
13

Иногда то, что может вызывать проблему, не имеет ничего общего с основным классом, и мне пришлось найти это с трудом. Это была ссылка на библиотеку, которую я переместил, и это дало мне:

Не удалось найти или загрузить основной класс xxx Linux

Я просто удалил эту ссылку, добавил ее снова, и она снова работала нормально.

  • 1
    Похоже, проблема была в том, что у вас был неправильный путь к классу из-за неправильной ссылки в вашем проекте в вашей IDE. Я обновлю свой ответ, чтобы покрыть этот случай.
  • 0
    @StephenC и EduardoDennis, это было то, что здесь также отсутствовал jar, что jar содержал интерфейс, от которого зависел основной класс для создания экземпляра. Итак, сообщение об ошибке слишком широкое. Я должен сказать «не удалось найти», если файл класса не найден, и «не удалось загрузить (отсутствуют зависимости)», если отсутствует что-то еще, кроме самого файла, поэтому слишком широкое сообщение об ошибке приводит к ошибкам, если вы фокусируете только на "найти" часть этого :(
Показать ещё 3 комментария
12

Используйте эту команду:

java -cp . [PACKAGE.]CLASSNAME

Пример. Если ваше имя класса является Hello.class, созданным из Hello.java, используйте следующую команду:

java -cp . Hello

Если ваш файл Hello.java находится внутри пакета com.demo, используйте следующую команду:

java -cp . com.demo.Hello

С JDK 8 много раз случается, что файл класса присутствует в той же папке, но команда java ожидает classpath, и по этой причине мы добавляем -cp. взять текущую папку в качестве ссылки для classpath.

  • 0
    Это работает только в простых случаях. Более сложные случаи требуют более сложного пути к классам.
  • 0
    А для >> действительно << простых случаев -cp . не требуется, потому что если $CLASSPATH не установлен, то . это путь к классу по умолчанию.
Показать ещё 5 комментариев
11

Попробуйте -Xdiag.

Стив С ответ хорошо описывает возможные случаи, но иногда определить, невозможно ли найти или загрузить класс, может быть не так просто. Используйте java -Xdiag (с JDK 7). Это выдает красивую стеклу, которая дает подсказку тому, что сообщение Could not find or load main class средства сообщения Could not find or load main class.

Например, он может указывать на другие классы, используемые основным классом, которые невозможно найти и предотвратить загрузку основного класса.

8

В этом случае у вас есть:

Не удалось найти или загрузить основной класс ?

Это потому, что вы используете "-classpath", но тире - это не та тире, которая используется java в командной строке. У меня была эта проблема копирования и вставки из блокнота в cmd.

  • 2
    Вот Это Да! Это совершенно странная причина! (Но он подходит вам для использования Блокнота вместо реального текстового редактора :-))
6

В моем случае возникла ошибка, потому что я дал имя исходного файла вместо имени класса.

Нам нужно предоставить имя класса, содержащее основной метод, интерпретатору.

  • 0
    Да. Смотрите мой пример # 2 неправильных способов указать имя класса!
5

Если вы используете Maven для создания JAR файла, обязательно укажите основной класс в файле pom.xml:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
5

Это может помочь вам, если ваш случай определенно как мой: как начинающий я также столкнулся с этой проблемой, когда пытался запустить программу Java.

Я собрал его так:

javac HelloWorld.java

И я попытался запустить также с тем же расширением:

java Helloworld.java

Когда я удалил .java и переписал команду java HelloWorld, программа работала отлично. :)

  • 1
    Это потому, что вы выполняете скомпилированную версию вашего .java. На самом деле выполняется файл .class
  • 0
    Для записи, это то же самое, что и причина № 1, пример № 5 в моем ответе ...
Показать ещё 1 комментарий
5

Изображение 1363

Расположение файла класса: C:\test\com\company

Имя файла: Main.class

Полностью определенное имя класса: com.company.Main

Команда командной строки:

java  -classpath "C:\test" com.company.Main

Обратите внимание, что путь к классу НЕ включает \com\company

5

Все ответы здесь направлены на пользователей Windows. Для Mac разделитель классов class :, а не ;. В качестве параметра ошибки путь к классам с использованием ; не выбрасывается, тогда это может быть трудно обнаружить, если перейти от Windows к Mac.

Вот соответствующая команда Mac:

java -classpath ".:./lib/*" com.test.MyClass

Где в этом примере пакет com.test и папка lib также должна быть включена в путь к классам.

  • 1
    На Linux так же, как на Mac.
  • 0
    Почему /* необходимо?
5

Я потратил приличное время, пытаясь решить эту проблему. Я думал, что я как-то неправильно установил свой путь к классам, но проблема в том, что я набрал:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

вместо:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Я думал, что значение полностью квалифицированного означает включать полное имя пути вместо полного имени пакета.

  • 0
    Я обновил свой ответ, чтобы попытаться устранить эту путаницу.
  • 2
    Ни один из них не является правильным. Класс должен быть указан как utilities.myapp.Cool или как там его имя пакета, если оно есть.
4

Какая исправленная проблема в моем случае была:

Щелкните правой кнопкой мыши на проекте/классе, который вы хотите запустить, затем Run AsRun Configurations. Затем вы должны либо исправить существующую конфигурацию, либо добавить новое следующим образом:

откройте вкладку Classpath, нажмите кнопку Advanced..., затем добавьте bin папку вашего проекта.

4

Сначала установите путь, используя эту команду:

set path="paste the set path address"

Затем вам нужно загрузить программу. Введите "cd (имя папки)" в сохраненный диск и скомпилируйте его. Например, если моя программа, хранящаяся на диске D, введите "D:", нажмите "Enter" и введите "cd (имя папки)".

  • 4
    Это не помогает. Этот вопрос касается Java-программ, а не обычных исполняемых файлов. Java не использует PATH, чтобы найти что-либо, и если «cd» помогает, то это не случайно, а по воле случая.
  • 0
    if "cd" helps then it by luck rather than by judgement . Это неправильно (я считаю), так как Java использует текущий каталог . как часть пути к классам по умолчанию.
Показать ещё 1 комментарий
3

Хорошо, много ответов уже, но никто не упомянул случай, когда разрешение файла может быть виновником. При запуске пользователь не имеет доступа к файлу jar или одному из каталогов пути. Например, рассмотрим:

Файл /dir1/dir2/dir3/myjar.jar в /dir1/dir2/dir3/myjar.jar

Пользователь1, которому принадлежит банка, может сделать:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

Но это все еще не работает:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

Это связано с тем, что работающий пользователь (Пользователь2) не имеет доступа к dir1, dir2, javalibs или dir3. Это может свести с ума кого-то, когда Пользователь1 может видеть файлы и может получить к ним доступ, но ошибка все еще происходит для Пользователя2

3

Иногда, в некоторых онлайн-компиляторах, которые вы могли бы попробовать, вы получите эту ошибку, если не пишете public class [Classname], а просто class [Classname].

  • 0
    Примеры (обидящих компиляторов) пожалуйста. Хотя общепринято / нормально делать класс «точки входа» public , спецификации Java этого не требуют, равно как и стандартная команда java / Oracle / OpenJDK.
3

При запуске java с параметром -cp, как описано в Windows PowerShell, вы можете получить ошибку, которая выглядит примерно так:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

Чтобы PowerShell принял команду, аргументы параметра -cp должны содержаться в кавычках, как в:

java -cp 'someDependency.jar;.' ClassName

Формирование команды таким образом должно позволить Java обрабатывать аргументы classpath правильно.

3

Это конкретный случай, но так как я пришел на эту страницу, ища решение и не нашел его, я добавлю его здесь.

Windows (тестируется с 7) не принимает специальные символы (например, á) в именах классов и пакетов. Linux, однако.

Я узнал об этом, когда я построил .jar в NetBeans и попытался запустить его в командной строке. Он работал в NetBeans, но не в командной строке.

3

В Windows поместите .; в значение CLASSPATH в начале.

. (точка) означает "смотреть в текущем каталоге". Это постоянное решение.

Также вы можете установить его "один раз" с помощью набора CLASSPATH=%CLASSPATH%;.. Это будет продолжаться до тех пор, пока откроется ваше окно cmd.

  • 1
    Этот совет может или не может помочь. Это поможет, если дерево классов содержит классы в текущем каталоге. Это не будет, если они не. Я бы на самом деле этого не сделал. Вместо этого я бы создал однострочный скрипт-обертку, который работал бы независимо от того, находится ли пользователь в «правильном» каталоге.
2

У меня был странный.

Ошибка: не удалось найти или загрузить основной класс mypackage.App

Оказалось, что в моем проекте pom.xml была настройка pom (parent) (мой проект pom.xml указывал на родительский pom.xml), а относительныйPath был отключен/неверен.

Ниже приведен фрагмент моего проекта pom.xml

<parent>
    <groupId>myGroupId</groupId>
    <artifactId>pom-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../badPathHere/pom.xml</relativePath>
</parent> 

Как только я решил pom относительный путь, ошибка исчезла.

Пойди разберись.

2

Я также сталкивался с подобными ошибками при тестировании соединения Java MongoDB JDBC. Я думаю, что хорошо подвести итог моему окончательному решению коротким, чтобы в будущем кто-то мог напрямую изучить две команды и хорошо продолжать дальше.

Предположим, вы находитесь в каталоге, где есть файл Java и внешние зависимости (файлы JAR).

Обобщение:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - аргумент classpath; передавать все зависимые файлы JAR по одному
  • *.java - это файл класса Java, который имеет основной метод. SDSD

Бег:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Пожалуйста, наблюдайте за двоеточием (Unix)/запятой (Windows) после того, как все файлы JAR зависимости зависят от конца
  • В конце обратите внимание на имя основного класса без какого-либо расширения (нет.class или.java)
  • 0
    Все это предполагает, что 1) JavaMongoDBConnection не имеет пакета, и 2) вы не меняете каталог. Это, по меньшей мере, хрупко. И не объясняя проблемы, это заставит новичков попробовать этот подход в ситуациях, когда он не будет работать . Короче говоря, он поощряет «методы программирования вуду»: en.wikipedia.org/wiki/Voodoo_programming
2

В моем случае, я получил ошибку, потому что я смешал имена UPPER- и нижнего регистра пакетов в системе Windows 7. Изменение имен пакетов для всех нижних регистров разрешило проблему. Также обратите внимание, что в этом случае я не смог скомпилировать файл.java в файл.class; он просто не будет работать из того же (суб-под-подкаталога).

2

Вам действительно нужно сделать это из папки src. Там вы вводите следующую командную строку:

[name of the package].[Class Name] [arguments]

Скажем, ваш класс называется CommandLine.class, и код выглядит следующим образом:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

Затем вы должны cd в папку src, и команда, которую вам нужно запустить, будет выглядеть так:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

И вывод в командной строке будет:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
  • 2
    Класс не может называться «CommandLine.class». Это было бы ошибкой синтаксиса Java. (Вы имеете в виду, что файл, содержащий скомпилированный класс, называется «CommandLine.class» ...). Другая проблема заключается в том, что ваша инструкция «cd в исходный каталог» работает только в том случае, если вы скомпилировали код >> в << исходное дерево каталогов. Наконец, если ваша компиляция использовала аргумент "-cp", то вам нужен эквивалент при запуске.
  • 0
    В моем проекте у меня есть папка src и папка bin в корне. Я должен был cd - src java ../bin com.blah.blah.MyClass cd в src , а затем выполнить команду java ../bin com.blah.blah.MyClass , который работал для меня. Так что спасибо за совет!
1

У меня была та же проблема и, наконец, я нашел свою ошибку :) Я использовал эту команду для компиляции, и она работала правильно.

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

но эта команда не работает для меня (не удалось найти или загрузить основной класс qrcode)

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

Наконец, я просто добавил символ ":" в конец пути к классу, и проблема решена.

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode

)

1

Если эта проблема связана с Eclipse:

Попробуйте добавить проект в ваш путь к классу.

см. изображение ниже:

Изображение 1365

Этот метод работал для меня.

1

В контексте разработки IDE (Eclipse, NetBeans или что-то еще) вам нужно настроить свойства вашего проекта на основной класс, чтобы ваша среда IDE знала, где находится основной класс, когда вы нажимаете "Play".

  1. Щелкните правой кнопкой мыши свой проект, затем выберите Свойства
  2. Перейдите в категорию "Выполнить" и выберите главный класс
  3. Нажмите кнопку Run.

Изображение 1364

  • 0
    Тем не менее, вы не получите вышеупомянутые сообщения об ошибках, если вы попытаетесь запустить приложение без надлежащего main из IDE. (А для некоторых IDE вам не нужно настраивать модуль запуска, чтобы это произошло; например, run Eclipse найдет класс с методом main для вас.
  • 0
    Фактически, если вы запустите приложение без этой настройки, вы получите точное сообщение в исходном вопросе: Could not find or load main class ... Вот так я и добрался до этого поста :)
Показать ещё 1 комментарий
1

Иногда лучше удалить добавленные файлы JAR и добавить снова с помощью правильной сборки. Для меня это была обычная проблема, и я придерживался того же подхода:

  • Поместите все указанные JAR файлы в папку jarAddOns и скопируйте их в безопасное место.
  • Теперь из Eclipse (или из вашей IDE) удалите файлы JAR.
  • Переместить всю папку проекта из рабочей области в безопасное место.
  • Перезапустить Eclipse (ваша IDE)
  • Теперь импортируйте каталог проекта из безопасного места.
  • Добавьте JAR файлы в ваш проект из папки jarAddOns (ранее сохраненной в безопасном месте)
  • Путь сборки проекта, добавление JAR файлов и применение
  • Теперь запустите проект. Он не должен показывать ошибку.
  • 0
    Спасибо, Питер! У меня плохой способ записи / форматирования.
1

Я не смог решить эту проблему с решениями, изложенными здесь (хотя, как утверждается, ответ, несомненно, очистил мои концепции). Я столкнулся с этой проблемой два раза и каждый раз пробовал разные решения (в Eclipse IDE).

  • Во-первых, я столкнулся с несколькими методами main в разных классах моего проекта. Итак, я удалил метод main из последующих классов.
  • Во-вторых, я пробовал следующее решение:
    • Щелкните правой кнопкой мыши мой основной каталог проекта.
    • Отправляйтесь к источнику, затем очистите и придерживайтесь настроек по умолчанию и в разделе "Готово". После некоторых фоновых задач вы будете перенаправлены в основную директорию проекта.
    • После этого я закрываю свой проект, открываю его снова и бум, наконец решил свою проблему.
  • 1
    Удаление main методов не решит проблему. Технически нет ничего плохого в приложении, которое имеет несколько точек входа.
1

Я получил эту ошибку после выполнения mvn eclipse:eclipse Это немного испортило мой файл .classpath.

Чтобы изменить строки в .classpath из

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

to

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
1

В Java, когда вы иногда запускаете JVM из командной строки с помощью исполняемого файла java и пытаетесь запустить программу из файла класса с открытым статическим void main (PSVM), вы можете столкнуться с приведенной ниже ошибкой, даже если classpath для JVM является точной и файл класса присутствует в пути к классам:

Error: main class not found or loaded

Это происходит, если файл класса с PSVM не может быть загружен. Одна из возможных причин этого заключается в том, что класс может реализовывать интерфейс или расширять другой класс, который не находится в пути к классам. Обычно, если класс не находится в пути к классам, то выдаваемая ошибка указывает как таковой. Но, если используемый класс расширен или реализован, java не может загрузить сам класс.

Ссылка: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/

  • 1
    Вы прочитали принятый ответ? Ваш ответ добавляет что-нибудь новое?
  • 1
    @StephenC Я пытался найти причину в вашем списке, просматривая категории «Причина» и их пункты. Я не смог найти точки совпадения в заголовке «Причина № 1» и «Причина № 2», который не выглядел близко к моему случаю (потому что я был уверен, что с самим classpath проблем нет). Я нашел причину, выполнив эксперименты, и был удивлен, что в моем случае была показана ошибка «main class not found», потому что интерфейс реализации не был на пути к классам. Конечно, вы можете сказать: «Вы должны прочитать все, что описано в посте», но мне кажется, ваш список причин может быть улучшен.
0

Решение "Не удалось загрузить ошибку основного класса"

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

  1. Попробуйте установить JRE 32 или 64. Если это не работает,
  2. Открыть в C:\Program Files (x86)\Java или C:\Program Files\Java

    • я. откройте папку jdk папку bin.
    • II. Скопируйте путь и добавьте его в переменные среды. Убедитесь, что вы разделяете переменные с точкой с запятой ; , Например, " C:\Yargato\bin; C:\java\bin; ". Если вы этого не сделаете, это вызовет больше ошибок.

    • III. Перейдите в папку jre и откройте папку bin.

    • внутривенно Здесь поиск файла rt.jar. Мой:

      C:\Program Files (x86)\Java\jre1.8.0_73\lib\rt.jar Скопируйте и переопределите переменную окружения и найдите переменную classpath и вставьте ее туда.

    • v. Теперь перезапустите cmd и повторите попытку. Ошибка исчезнет.
    • VI. Я отправлю ссылку на видеоурок YouTube.
  • 2
    Это вуду. %JAVA_HOME\bin% обязательно должен быть в %PATH% , но это вызывает другую ошибку. %JAVA_HOME\lib\rt.jar% не нужно добавлять в %JAVA_HOME\lib\rt.jar% к классам. Он автоматически добавляется в путь начальной загрузки всеми необходимыми инструментами JRE или JDK.
  • 0
    Ошибка появляется, когда она не добавлена. Вот почему шаг 1 очень важен.
Показать ещё 9 комментариев
0

В MacOS:

Шаг 1. Создайте каталог/папку MyProject. Используйте эту команду:

$mkdir MyProject

Шаг-2: $cd MyProject

Шаг-3: $mkdir src

Шаг-4: Создает все файлы источников java в src.

Шаг 5. Создайте основной файл проекта MainProgamTest.java, его должен содержать метод main().

Убедитесь, что:

5.1) MainProgamTest.java, он не должен содержать строку пакет src;

5.2) MainProgamTest.java, он должен содержать строку import src. *;

Шаг 6: перейдите в каталог/папку MyProject. Скомпилируйте проект следующим образом:

$javac MainProgamTest.java

Шаг 7: в том же каталоге/папке запустите его:

$java MainProgamTest

Вот и все.

0

В окнах он чувствителен к регистру. Поэтому Java –jar Jenkins.war

не работал, вместо этого нам пришлось удалить корпус Java –jar Jenkins.war

0

Еще один ответ...:

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

0

Ошибка довольно очевидна, она говорит, что класс, который вы используете с использованием java classname, не содержит основного метода, поскольку он запускает основной метод, потому что все выполнение начинается с основного метода!

0

По умолчанию используется Java . , текущий рабочий каталог, как CLASSPATH по умолчанию. Это означает, что при java -cp. MyClass команды в приглашении, например, java MyClass, команда интерпретируется так, как если бы у вас был тип java -cp. MyClass java -cp. MyClass. Вы видели эту точку между -cp и MyClass? (cp является коротким для более длинной опции pathpath)

Этого достаточно для большинства случаев, и кажется, что все работает нормально, пока вы не попытаетесь добавить каталог в свой CLASSPATH. В большинстве случаев, когда программисты должны это делать, они просто запускают команду как set CLASSPATH=path\to\some\dir. Эта команда создает новую переменную среды CLASSPATH имеющую path\to\some\dir значения path\to\some\dir или заменяет ее значение с помощью path\to\some\dir если CLASSPATH уже был установлен ранее.

Когда это будет сделано, теперь у вас есть переменная среды CLASSPATH и Java больше не использует свой путь по умолчанию (.), А тот, который вы установили. Поэтому на следующий день вы откроете свой редактор, напишите какую-нибудь java-программу, cd в каталог, где вы ее сохранили, скомпилируете и попробуйте запустить ее с помощью команды java MyClass, и вас приветствует хороший вывод: не удалось найти или load main class... (Если ваши команды работали задолго до того, и теперь вы получаете этот вывод, то это может быть для вас).

Случается, что когда вы запускаете команду java MyClass, Java ищет файл класса с именем MyClass в каталоге или каталогах, которые вы установили в своем CLASSPATH а не в текущем рабочем каталоге, чтобы он не нашел ваш файл класса и, следовательно, жалуется.

Что вам нужно сделать, это добавить . к вашему пути к классу, который можно выполнить с помощью set CLASSPATH=%CLASSPATH%;. команд set CLASSPATH=%CLASSPATH%;. (обратите внимание на точку после точки с запятой). На простом английском языке эта команда говорит: "Выберите то, что было первоначально значение CLASSPATH (%CLASSPATH%), добавить . К нему (;.) И присвоить результат обратно в CLASSPATH ".

И voila, вы снова можете использовать свою команду java MyClass как обычно.

0

Похоже, когда у меня была эта проблема, она была уникальной.

Как только я удалил объявление пакета в верхней части файла, он отлично работал.

Кроме того, не было никакого способа запустить простой HelloWorld.java на моей машине, независимо от папки, в которой произошла компиляция, из CLASSPATH или PATH, из параметров или папки, вызываемой из.

  • 3
    Есть много способов заставить это работать. Все сводится к >> пониманию << как использовать механизм пути к классам Java. Пожалуйста, прочитайте мой ответ и ресурсы, на которые он ссылается.
  • 3
    И если вы доведите это «решение» до логического завершения, то в конечном итоге вы объявите все свои классы в пакете по умолчанию, что является серьезной плохой идеей для программ значительного размера.
-1

В моем случае я просто изменяю JRE в затмении. Пожалуйста, найдите прилагаемый скриншот. Изображение 1366

-2

Щелкните правой кнопкой мыши по проекту.

  1. выберите "открыть настройки модуля"
  2. пометить папку src как "источники"
  3. Перейти к редактированию конфигурации, затем выберите свой основной класс
  4. нажмите кнопку ОК или применить

Это сработало для меня. Спасибо

-2

Отвечая по отношению к внешней библиотеке -

Обобщение:

javac -cp ./<external lib jar>: <program-name>.java

Выполнение:

java -cp ./<external lib jar>: <program-name>

Вышеприведенная схема хорошо работает в системах OSX и Linux. Обратите внимание: в classpath

-2

Для подключения к базе данных я получал это. Я просто добавил следующее в путь класса:

export CLASSPATH=<path>/db2jcc4.jar:**./**

Здесь я добавил ./ в последний раз, чтобы мой класс также идентифицировался при загрузке.

Теперь просто запустите:

java ConnectionExample <args>

Это сработало отлично.

  • 1
    Это не удастся, если вы не в каталоге, где вы скомпилировали классы.
-3

предположим, что ваши настройки:

CLASSPATH =; C:\Program Files\Java\jdk1.8.0_171\lib;

JAVA_HOME = C:\Program Files\Java\jdk1.8.0_171

Путь = C:\Windows; C:\Program Files (x86)\Skype\Phone \; C:\Go\bin; C:\Program Files\Java\jdk1.8.0_17 1\bin;.;

Ваш файл класса: c:\you\bin\packageName\xyz.class Ваш класс xyz.class находится в пакете: packageName

Затем:

cd c:\you\bin\
java packageName.xyz

Ещё вопросы

Сообщество Overcoder
Наверх
Меню