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

avatar
Stephen C
7 августа 2013 в 03:02
3475521
60
1640

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

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

Источник
Stephen C
7 августа 2013 в 03:21
63

Обратите внимание, что это вопрос для самостоятельного ответа, который предназначен для использования в качестве общих справочных вопросов и ответов для новых пользователей Java. Я не смог найти существующие вопросы и ответы, которые адекватно освещают это (ИМО).

Ответы (60)

avatar
Stephen C
7 августа 2013 в 03:02
1471

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

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

Обычный синтаксис 1 следующий:

    java [ <options> ] <class-name> [<arg> ...]

, где <option> - параметр командной строки (начинается с символа «-»), <class-name> - полное имя класса Java, а <arg> - произвольный аргумент командной строки, который передается вашему приложению.


1 - Есть некоторые другие синтаксисы, которые описаны в конце этого ответа.

Полное имя (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 с сигнатурой , типом возврата и модификаторами , заданными <469> .173989 (Обратите внимание, что имя аргумента метода - НЕ часть подписи.)
  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 11 или новее; см. Ниже)

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

    java lots of arguments
    

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

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

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

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

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

Когда вы помещаете каталог в путь к классам, он условно соответствует корню квалифицированного пространства имен. Классы располагаются в структуре каталогов ниже этого корня, , путем сопоставления полного имени с именем пути . Так, например, если «/ 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 не найдет ваш класс.

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

    Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
    

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

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

  • вы хотите запустить 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 и т. Д.
  • Тщательно подумайте, выбирая между абсолютными и относительными путями в путях к классам. Помните, что относительный путь может "сломаться" при изменении текущего каталога.

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

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

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

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

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

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

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

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

Наконец, вы, очевидно, можете столкнуться с этой проблемой, если попытаетесь запустить из файла JAR с неправильными подписями в (META-INF/*.SF) или если есть синтаксическая ошибка в файле MANIFEST.MF (см. Https://coderhelper.com / a / 67145190/139985).


Альтернативный синтаксис для java

Есть три альтернативных синтаксиса для запуска программ Java с использованием java command.

  1. Для запуска «исполняемого» файла JAR используется следующий синтаксис:

    java [ <options> ] -jar <jar-file-name> [<arg> ...]
    

    например,

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

    Имя класса точки входа (т.е. com.acme.example.ListUser) и путь к классам указаны в МАНИФЕСТЕ файла JAR.

  2. Синтаксис для запуска приложения из модуля (Java 9 и новее) следующий:

    java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
    

    Имя класса точки входа либо определяется самим <module>, либо задается необязательным <mainclass>.

  3. Начиная с Java 11, вы можете использовать команду java для компиляции и запуска одного файла исходного кода, используя следующий синтаксис:

    java [ <options> ] <sourcefile> [<arg> ...]
    

    , где <sourcefile> - (обычно) файл с суффиксом ".java".

Дополнительные сведения см. В официальной документации по команде java для используемой версии Java.


IDE

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

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

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

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


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

lanoxx
8 февраля 2014 в 19:24
54

У меня возникла эта проблема, когда я пытался запустить класс со сторонней библиотекой. Я вызвал Java так: java -cp ../third-party-library.jar com.my.package.MyClass; это не работает, вместо этого необходимо добавить локальную папку в путь к классу (разделить :, например: java -cp ../third-party-library.jar:. com.my.package.MyClass, тогда он должен работать

keyser
31 января 2015 в 11:22
34

После многих лет программирования на Java мне все же удалось оказаться на этой странице. Для меня проблема заключалась в том, что синтаксис пути к классам зависит от ОС. Я новичок в программировании на Windows и понятия не имел.

MSX
3 октября 2016 в 10:03
8

Дополнительные примечания, пункт 2 спасите меня! Печально видеть, что java не говорит, что он не находит импортированный класс, а вместо этого указывает основной класс, который вы пытаетесь запустить. Это заблуждение, хотя я уверен, что для этого есть причина. У меня был случай, когда java точно знал, где находится мой класс, но не смог найти ни одного из импортированных классов. Вместо того, чтобы сказать это, он пожаловался на то, что не нашел мой основной класс. Действительно, раздражает.

GregT
18 января 2018 в 10:18
0

У меня дважды возникала эта проблема в Eclipse. В первый раз подпись main () была неправильной. Во второй раз я переименовал .jar, и хотя я добавил новый в путь сборки, Eclipse не нашел старый, поэтому проект не скомпилировался с этой ошибкой. Мне пришлось удалить файл .jar из Project> Properties> Java Build Path> Libraries.

GregT
9 мая 2018 в 07:57
0

Я столкнулся с этим в третий раз. Я запустил программу из командного файла Windows 10 и поместил имя .jar в переменную (вызываемую с помощью "-cp% jarname%; lib *"). Я по ошибке поставил лишний пробел в конце имени jarname, и это вызвало ошибку. Хет-трик :)

codeaperature
11 декабря 2018 в 18:38
0

В моем случае с spark2-submit Error: Could not find or load main class = без имени класса в заявлении об ошибке было вызвано ошибкой файла spark.properties, где у меня были пробелы вокруг знака = в spark.driver.extraJavaOptions -Dlog4j.configuration = log4j.properties, объявленном как часть spark2- отправить параметр строки cmd --files hdfs://.../log4j.properties. Удаление всех пробелов, исправленных во всех похожих строках, решило эту проблему.

user3183018
14 декабря 2018 в 14:18
0

@lanoxx: Я согласен, что это сбивает с толку, поскольку поведение по умолчанию, когда не задан путь к классам, включает текущий каталог. Если вы установите путь к классам, это значение по умолчанию будет перезаписано указанным вами путем к классам. Причина в том, что вы можете не захотеть включать CWD - часто для предотвращения загрузки нежелательного / неизвестного класса.

Nimitz14
3 марта 2021 в 19:27
0

Мне нужно было включить текущий каталог и использовать; вместо того :

RT Denver
19 апреля 2021 в 23:21
0

Для меня было откровением, что использования параметра -cp в командной строке самого по себе было недостаточно, если переменная CLASSPATH никогда не была установлена, например на недавно настроенной машине. Как только я определился в оболочке, все заработало. Кто бы мог подумать!

Bee
7 июля 2021 в 16:31
0

Я прочитал весь этот пост и так много узнал, и что на самом деле сработало для меня, так это самая последняя строчка - «стоит попробовать другие вещи, например, перезапустить вашу IDE». ржу не могу

Blaisem
30 июля 2021 в 07:48
0

Невероятно подробный комментарий. Моя проблема была 2c, не мог найти ее в другом месте. Спасибо за помощь.

Amulya Koppula
23 сентября 2021 в 11:07
0

Очень подробное объяснение. Цените терпение !! Для меня в eclipse IDE очистка и перестройка проекта решили проблему.

PeterXX
15 октября 2021 в 20:07
0

Причина № 2b - это то, с чем, вероятно, борются большинство новичков - если вы привыкли к .Net, сначала может показаться странным, что структура каталогов должна иметь значение.

Stephen C
15 октября 2021 в 22:48
0

На самом деле, исходя из моих наблюдений (людей, которые задают вопросы, которые закрыты как дубликаты этого), # 2b встречается довольно редко. №2 и №2а встречаются гораздо чаще.

Stephen C
18 ноября 2021 в 22:47
0

Микаэль Майер - Ваше добавление уже описано в Причине №2, а не в 6. Итак, я откатил его.

avatar
ritu mansata
1 февраля 2022 в 08:10
-1

Если имя вашего пакета javatpoint и имя пакета com.javatpoint и имя класса Другой ваш класс<566085084, затем скомпилируйте так:

cd C:\Users\JAY GURUDEV\eclipse-workspace\javatpoint\src\com\javatpoint
javac AnotherOne.java

И запустите этот класс, используя

cd C:\Users\JAY GURUDEV\eclipse-workspace\javatpoint\src
java com.javatpoint.AnotherOne

(Здесь следует исключить имя пакета.)

Lefteris Xris
1 февраля 2022 в 09:11
3

Я отредактировал формат вашего сообщения (исполняемые блоки), поэтому, пожалуйста, следите за форматированием в своих следующих сообщениях. Кроме того, какова добавленная стоимость по сравнению с этим ответом? (тот же пост) coderhelper.com/questions/18093928/…

ritu mansata
1 февраля 2022 в 09:54
0

да, я не видел этого ответа должным образом, поэтому .. спасибо за редактирование @LefterisXris

avatar
Madhav Balakrishnan Nair
24 января 2022 в 01:12
-1

В основном это означает, что не существует статического метода main(String[] args). Это должно разрешить это автоматически. Если нет, то что-то было не так, когда программа создавалась (у нее нет основного метода) или когда программа была упакована (неверная информация в манифесте).

Это работает

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Это не работает

public class Hello {
    public Hello() {
        System.out.println("Hello");
    }
}
Stephen C
24 января 2022 в 01:39
0

Этот ответ вводит в заблуждение. Исключение + сообщение может быть вызвано многими разными причинами. Это НЕ "в основном" вызвано одной вещью.

Stephen C
24 января 2022 в 01:47
0

И... на самом деле... если ваш "основной" класс (Hello в вашем примере) не содержит подходящего метода main, вы фактически получите другое исключение + сообщение. Так что ваш ответ даже не по поводу вопроса.

avatar
Juliano Soder
13 декабря 2021 в 20:23
0

Самый простой способ исправить это - повторно загрузить maven apache здесь: https://maven.apache.org/download.cgi

, чем вы снова задаете свой путь enter image description here

СИСТЕМНАЯ ПЕРЕМЕННАЯ

укажите путь, по которому вы установили свою папку apache maven, например: C: \ Program Files \ apache-maven-3.8.4 \ bin

enter image description here

Перезагрузите терминал или IDE, и все должно работать.

У меня всегда работает.

Juliano Soder
13 декабря 2021 в 20:30
0

Если вы не запускаете проект maven, попробуйте проверить свой java PATH, иногда, если путь java не установлен, ваша программа не запускается, потому что не удается найти основной класс.

avatar
Rishi Bansal
20 сентября 2021 в 09:26
1

Я поднялся на один уровень выше. Итак, теперь файл HelloWorld.class находится в hello \ HelloWorld.class и запускается под командой. Где cp - путь к классам, а. означает проверку только в текущем каталоге.

java -cp . hello.HelloWorld

Вывод

Hello world!
avatar
Ayan
24 февраля 2021 в 16:00
-2

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

Для меня комментарий к этой строке помог мне предотвратить эту ошибку.

//package com.company;
Stephen C
25 марта 2021 в 12:02
0

Не хотите ли объяснить, почему он это исправил?

Ayan
9 апреля 2021 в 16:26
0

Да, поэтому в основном я пытался запустить java-код за пределами пакета com.company, поэтому, комментируя эту часть, он был отключен, и я также смог запустить его в онлайн-gdb

Stephen C
10 апреля 2021 в 05:05
0

Если вам нужно это сделать, чтобы он заработал, Online Gdb в основном не работает.

iDeveloper
13 октября 2021 в 06:51
0

Ожидается лучшее объяснение

avatar
SANN3
3 февраля 2021 в 17:31
-3

Исключение следующих файлов решило проблему.

META-INF / *. SF

META-INF / *. DSA

META-INF / *. RSA

Добавлен следующий код в build.gradle

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    manifest {
        attributes(
                'Main-Class': 'mainclass'
        )
    }
}
Stephen C
4 февраля 2021 в 00:29
0

Почему это решило проблему? Что ты на самом деле здесь делаешь? Это похоже на взлом, который вы могли бы сделать, если бы вы изменяли подписанный JAR-файл. Пожалуйста, объясните, что вы на самом деле делаете ... чтобы люди могли решить, соответствует ли ваше решение "это работает для меня" тому, что они делают.

avatar
Shardayyy
12 января 2021 в 20:58
-1

Вот как я решил свою проблему.

Я заметил, что если вы включаете файлы jar в свою компиляцию, добавление текущего каталога (./) в путь к классам помогает.

javac -cp "abc.jar; efg.jar" MyClass.java
java -cp "abc.jar; efg.jar" MyClass

VS

javac -cp " ./ ; abc.jar; efg.jar" MyClass.java
java -cp " ./ ; abc.jar; efg.jar" MyClass

Stephen C
12 января 2021 в 22:30
1

Это не должно иметь никакого значения. Обе формы допустимы для Java и эквивалентны.

Shardayyy
13 января 2021 в 23:24
0

Я буду редактировать, путь к классам "./" имеет самое большое значение.

Stephen C
13 января 2021 в 23:27
0

Ну да. Неправильный путь к классам - причина №2 принятого ответа. И обратите внимание, что ваше конкретное исправление работает только при некоторых обстоятельствах. (Например, он не будет работать в MacOS или Linux.)

avatar
leonidaa
28 декабря 2020 в 17:12
0
  • в Intellij Проверьте свои глобальные библиотеки и локальные библиотеки
  • проверьте в pom.xml версию библиотеки, возможно, это старая библиотека
  • это так много возможностей, упомянутых выше, которые необходимо попробовать тоже
avatar
leonidaa
28 декабря 2020 в 09:52
0

Причина № 2 - неверно указан путь к классам приложения. Прочтите три документа, ссылки на которые приведены выше. (Да ... ПРОЧИТАЙТЕ их! Важно, чтобы программист на Java понимал хотя бы основы того, как работают механизмы пути к классам Java.) Я хочу добавить эту документацию в этот очень хороший пост сверху Общая информация об инструментах и ​​утилитах JDK ( структура файла, путь к классам, способ нахождения классов, изменения) Улучшения (улучшения в JDK 7) Стандартные инструменты и утилиты JDK https://docs.oracle.com/javase/7/docs/technotes/tools/index.html https://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html https://docs.oracle.com/javase/7/docs/technotes/ tools / windows / classpath.html Как средство запуска Java находит классы Понимание пути к классам и имен пакетов https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac. html

Загрузчик классов в Java Загрузчик классов Java - это часть среды выполнения Java, которая динамически загружает классы Java в виртуальную машину Java. Системе времени выполнения Java не нужно знать о файлах и файловых системах из-за загрузчиков классов. Классы Java загружаются в память не сразу, а по требованию приложения. На этом этапе JRE вызывает Java ClassLoader, и эти ClassLoader загружают классы в память динамически. https://en.wikipedia.org/wiki/Java_Classloader https://www.geeksforgeeks.org/classloader-in-java/ https: // ru. wikipedia.org/wiki/Java_virtual_machine enter image description here
enter image description here enter image description here

Stephen C
1 января 2021 в 04:53
0

Спасибо, но нет. Поведение иерархий загрузчиков классов вряд ли станет причиной проблем читателя. Если вы посмотрите на причину № 2, вы заметите, что она написана как и побуждает читателя пойти куда-нибудь еще для объяснения пути к классам и связанных вещей. Я принял осознанное и взвешенное решение сделать это. (В идеале должен быть еще один канонический вопрос и ответ, описывающий это. Также обратите внимание, что люди уже жалуются, что мой ответ на этот вопрос уже слишком длинный.

avatar
Dupinder Singh
4 ноября 2020 в 17:38
1

[Версия Java: 11]

Если вы используете Java 11, вам не нужно компилировать и запускать файл java.

Просто запустите как

Java ClassName.java

Пример:

class abc{ 
    public static void main(String[] args){
        System.out.println("hello Jarvis ");    
    }
}

Теперь запустите команду

java abc.java

enter image description here

Stephen C
4 ноября 2020 в 22:26
0

1) Не отвечает на вопрос. 2) Альтернатива №3 «Альтернативные синтаксисы для java».

avatar
Ted
19 сентября 2020 в 12:55
2

Сценарий: с использованием командной строки ( CMD в Windows) для компиляции и запуска только <1437141085713> простой программы, которая имеет только <14371410> Файл ' Main.java ' с указанным ' основным пакетом '.

Путь к исходному файлу:

папка-имя-проекта \ src \ main \ Main.java

Целевая папка:

некоторая-папка-имя-проекта \ dest

Путь к целевому файлу (папка \ main и файл \ Main.class будут созданы javac):

папка-имя-проекта \ dest \ main \ Main.class

Main.java выглядит следующим образом:

package main;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

Составление:

// 'javac' compiler will produce 'Main.class' in the 'dest\main' folder.
// 'main' folder is created because in the source file(in our case: 'Main.java') is
// specified 'package main'.

javac -d ./dest ./src/main/Main.java

Запустить скомпилированный файл (в нашем случае: Main.class):

// '-cp'(is the same as '-classpath')
// './dest'(means destination folder, where resides compiled 'Main.class').
// 'main.Main'(means 'package' 'main', which contains class 'Main'('Main.class'))
// WARNING: when run 'java' class, MUST NOT type extension '.class'
//          after 'class name
//          (in our case: 'main.Main'(<package>.<class-name>) WITHOUT extension 
//           '.class').

java -cp ./dest main.Main

// Hello world
Stephen C
22 января 2021 в 04:51
0

Говорит то же, что и coderhelper.com/a/26587225/139985 (с 2014 г.)

avatar
Vishv Shroff
17 сентября 2020 в 02:49
2

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

package javaapplication3;
public class JavaApplication3 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    System.out.println("Hello");
}

}

это моя программа, которую я хочу запустить, которая находится в C: \ Java Projects \ JavaApplication3 \ src \ javaapplication3

Теперь откройте cmd в этом месте и скомпилируйте программу с помощью этой команды

javac JavaApplication3.java

После компиляции перейдите на один каталог вниз, т.е. C: \ Java Projects \ JavaApplication3 \ src

теперь выполните следующую команду для выполнения программы

java javaapplication3.JavaApplication3
Stephen C
17 сентября 2020 в 02:55
1

Если это сработает для вас, то в вашем исходном коде должен быть оператор package javaapplication3;, который вы не включили в ответ.

Vishv Shroff
17 сентября 2020 в 02:59
1

@StephenC Ооо, мне очень жаль, что я включил, что я обновлю свой ответ.

Stephen C
22 января 2021 в 04:51
0

Теперь он говорит по сути то же самое, что и coderhelper.com/a/26587225/139985 (с 2014 г.)

avatar
Vitaliy
14 июля 2020 в 12:30
-1

Еще один сценарий, который заставил меня почесать голову, и я не нашел здесь ссылки на него:

package com.me
Public class Awesome extends AwesomeLibObject {
    ....
    public static void main(String[] argv) {
         System.out.println("YESS0");
    }
}

Где AwesomeLibObject - это класс, определенный во внешней библиотеке. У меня такое же сбивающее с толку сообщение об ошибке:

Error: Could not find or load main class com.Awesome

Решение простое: внешняя библиотека также должна быть в пути к классам!

Stephen C
14 июля 2020 в 12:35
1

Причина # 2c - неверный путь к классам / отсутствует зависимость

avatar
Hayk Kerobyan
5 июня 2020 в 20:32
1

Если вы используете IntelliJ и получаете сообщение об ошибке при запуске основного метода из IDE, просто убедитесь, что ваш класс находится в пакете java, а не в kotlin enter image description here

avatar
Ryan Luo Xu
10 мая 2020 в 11:48
0

У меня возникла эта проблема для моей демонстрационной программы, созданной в IntelliJ.

Есть два ключевых момента для решения этой проблемы:

  1. имя пакета программы
  2. текущий рабочий каталог терминала / командной строки

моя демонстрационная программа:

package io.rlx.tij.c2;

public class Ex10 {
    public static void main(String[] args) {
        // do something
    }
}

путь к исходному коду:

../projectRoot/src/main/java/io/rlx/tij/c2/Ex10.java
  1. перейдите в java каталог: cd ../projectRoot/src/main/java
  2. скомпилировать в класс: javac ./io/rlx/tij/c2/Ex10.java
  3. запустить программу: java io.rlx.tij.c2.Ex10

, если я запускаю программу в ../projectRoot/src/main/java/io/rlx/tij/c2 или запускаю ее без имени пакета, я получаю следующую ошибку: Error: Could not find or load main class.

Stephen C
22 января 2021 в 04:52
0

Говорит то же, что и coderhelper.com/a/26587225/139985 (с 2014 г.)

avatar
Nikolay Valtchanov
26 ноября 2019 в 20:08
2

Вот еще одна проблема, на которую у меня ушло немного времени: параметр пути к классу в командной строке ведет себя не так, как вы ожидаете. Я использую MacOS и вызываю интерфейс командной строки напрямую, и я включаю в вызов два jar-файла.

Например, оба они сбивали инструмент с толку относительно имени основного класса:

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

java -cp path/to/jars/* com.mypackage.Main

А этот, потому что - я не уверен, почему:

java -cp "*.jar" com.mypackage.Main

Это сработало:

java -cp "path/to/jars/*" com.mypackage.Main

Явное перечисление двух jar-файлов также работало:

java -cp path/to/jars/jar1.jar:path/to/jars/jar2.jar com.mypackage.Main

Stephen C
27 ноября 2019 в 04:45
1

«Я не уверен, почему» - потому что * расширяется оболочкой до списка имен файлов JAR , разделенных пробелами ... если они не заключены в кавычки. Это стандартная оболочка UNIX. Что касается остального: все это в ручном вводе java, включая использование : и синтаксис подстановочных знаков ("path/to/jars/*").

Nikolay Valtchanov
28 ноября 2019 в 08:03
0

Это было «не уверен, почему» * .jar «не работает». Первый был более очевидным, потому что с ним возился снаряд.

Stephen C
28 ноября 2019 в 08:06
0

Второй не работает, потому что команда java не распознает этот подстановочный знак. Руководство java объясняет, что в нем понимается.

avatar
parsecer
10 июля 2019 в 23:12
1

Это случилось и со мной. В моем случае это произошло только тогда, когда в исходном коде присутствовал класс HttpServlet (IntelliJ IDEA не выдает ошибку времени компиляции; пакет сервлета был импортирован нормально, однако во время выполнения возникла эта ошибка main class) .

Мне удалось решить эту проблему. Я зашел в меню Файл Структура проекта ... :

Enter image description here

Затем к Модули :

Enter image description here

Была предоставлена ​​область рядом с модулем сервлета. Я изменил его на Скомпилировать :

Enter image description here

И это сработало!

avatar
S Krishna
23 июня 2019 в 06:40
-2

Если это Maven проект :

  1. Перейти к файлу POM.
  2. Удалите все зависимости.
  3. Сохраните файл POM.
  4. Снова импортируйте только необходимые зависимости.
  5. Сохраните файл POM.

Проблема должна исчезнуть.

avatar
Omid Mohebbi
18 марта 2019 в 06:19
12

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

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
avatar
suneelpervaiz
4 января 2019 в 12:27
-1

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

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

У меня это сработало.

avatar
biocyberman
26 сентября 2018 в 12:33
3

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

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

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

Пользователь1, владеющий файлом JAR, может:

# 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

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

avatar
Tunde Pizzle
19 сентября 2018 в 14:52
1

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

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

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

Enter image description here

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

avatar
Manish Shukla
16 сентября 2018 в 05:12
-2

Ответ относительно внешней библиотеки -

Компиляция:

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

Выполнить:

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

Приведенная выше схема хорошо работает в системах OS X и Linux. Обратите внимание на : в пути к классам.

avatar
granadaCoder
23 июля 2018 в 19:00
2

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

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

Оказалось, что у меня была ссылка на POM (родительский), закодированную в файле pom.xml моего проекта (pom.xml моего проекта указывал на родительский pom.xml) и <20920> было выключено / неправильно.

Ниже приведена часть файла pom.xml моего проекта:

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

Как только я разрешил POM relativePath, ошибка исчезла.

Иди на цифру.

avatar
Sam
17 июня 2018 в 12:22
-3

В моем случае я просто меняю JRE в Eclipse.

Найдите прикрепленный снимок экрана:

Enter image description here

avatar
khichar.anil
26 января 2018 в 20:15
3

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

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

Компиляция:

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

Выполнить:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Пожалуйста, соблюдайте двоеточие (Unix) / запятую (Windows) после окончания всех файлов зависимостей JAR
  • В конце обратите внимание на имя основного класса без какого-либо расширения (без .class или .java)
Stephen C
27 января 2018 в 00:25
0

Все это предполагает, что 1) JavaMongoDBConnection не имеет пакета и 2) вы не меняете каталог. Это, мягко говоря, хрупкое. И, не объясняя проблемы, это побудит новичков попробовать этот подход в ситуациях, когда он не будет работать . Короче говоря, он поощряет «техники программирования вуду»: en.wikipedia.org/wiki/Voodoo_programming

avatar
das sanctity
4 января 2018 в 22:01
-1

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

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

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

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

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

    • iv. Здесь найдите файл rt.jar . Мой:

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

    • v. Теперь перезапустите cmd и попробуйте запустить снова. Ошибка исчезнет.
    • vi. Я опубликую ссылку на свой видеоурок на YouTube.
Stephen C
4 января 2018 в 23:49
2

Это чепуха вуду. %JAVA_HOME\bin% действительно должен быть на %PATH%, но это вызывает другую ошибку. %JAVA_HOME\lib\rt.jar% не нужно добавлять в путь к классам. Он автоматически добавляется в путь к загрузочному классу всеми необходимыми инструментами JRE или JDK.

das sanctity
5 января 2018 в 20:56
0

Ошибка появляется когда не добавляется. Вот почему шаг 1 очень важен.

das sanctity
5 января 2018 в 21:04
0

Просто попробуйте, потому что сейчас это сработало для моих друзей в классе

Stephen C
6 января 2018 в 00:42
0

Я знаю, что вам нужно установить Java (да!) И поместить ее в свой% PATH%. Но если вы этого не сделаете, вы получите другое сообщение об ошибке . Например, «java не распознается как внутренняя или внешняя команда». Я повторяю, "решения", которые вы предлагаете, не решают >> эту << проблему.

das sanctity
6 января 2018 в 16:37
0

вам нужно завершить последнюю переменную среды точкой с запятой. перед добавлением нового пути. То есть "C: \ Yargato \ bin; C: \ java \ bin; C: \ Programfiles \ java ......; также заканчивайте его точкой с запятой

Peter Mortensen
6 февраля 2018 в 23:45
0

Вы должны нам ссылку на YouTube ... Вы можете просто добавить 11 символов после «watch?v=» в URL-адрес (например, yVRtJbXQsL8 для https://www.youtube.com/watch?v=yVRtJbXQsL8) и кто-нибудь может добавить реальный URL позже.

Stephen C
24 мая 2018 в 08:09
0

@dassanctity - Ваше утверждение, что путь к классам должен заканчиваться точкой с запятой, неверно согласно документации Oracle : docs.oracle.com/javase/8/docs/technotes/tools/windows/…

das sanctity
25 мая 2018 в 20:29
0

Согласно окнам, точка с запятой отделяет один путь среды от другого. Таким образом, он не должен заканчиваться точкой с запятой, но обязательно поставьте точку с запятой перед добавлением новой, иначе вы вызовете больше ошибок. Это не согласно определениям oracle, а windows

Stephen C
3 июня 2018 в 22:54
0

@dassanctity - Ваш комментарий от 25 мая противоречит вашим предыдущим комментариям. «вам нужно заканчивать последнюю переменную среды точкой с запятой». по сравнению с «Таким образом, она не должна заканчиваться точкой с запятой» . (ИМО, лучше всего удалить этот ответ. В нем слишком много ошибок, и он не добавляет ничего, о чем уже не говорят другие ответы.)

das sanctity
4 июня 2018 в 07:45
0

@StephenC позвольте мне использовать пример. Допустим, я хочу добавить этот новый env. path "C:\Program Files\Cisco Packet Tracer 7.0\bin" тогда, когда я перейду в свой env. paths, и я вижу другие пути, мне нужно убедиться, что другой путь заканчивается точкой с запятой, прежде чем добавлять новый путь. Это для Windows 8.1 или более ранней версии.

Stephen C
17 июня 2018 в 12:42
0

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

avatar
Howard007
26 декабря 2017 в 19:55
2

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

avatar
jmojico
22 августа 2017 в 04:22
1

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

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

Enter image description here

Stephen C
22 августа 2017 в 04:52
0

Однако вы не получите вышеупомянутые сообщения об ошибках, если попытаетесь запустить приложение без правильного main из IDE. (А для некоторых IDE вам не нужно настраивать программу запуска, чтобы это произошло; например, Eclipse run найдет класс с методом main.

jmojico
22 августа 2017 в 17:41
0

Фактически, если вы запустите приложение без этого параметра, вы получите точное сообщение в исходном вопросе: Could not find or load main class .... Так я попал на этот пост :)

Stephen C
22 августа 2017 в 22:44
0

Не в «Затмении» этого не произойдет. В Eclipse, если IDE не может идентифицировать ни один из классов с помощью main, вам просто не будет предложена опция «Выполнить»> «Приложение Java» в контекстном меню.

avatar
lor
18 августа 2017 в 18:29
2

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

Stephen C
23 июля 2018 в 22:42
0

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

avatar
Junchen Liu
15 июня 2017 в 16:19
8

Если вы используете 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>
avatar
Ramesh Pareek
1 июня 2017 в 10:36
8

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

Я скомпилировал это так:

javac HelloWorld.java

И я пробовал работать с тем же расширением:

java Helloworld.java

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

Jason V
20 сентября 2017 в 16:30
2

Это потому, что вы выполняете скомпилированную версию вашего .java. Фактически он выполняет файл .class

Stephen C
30 октября 2017 в 00:50
0

Для записи, это то же самое, что и Причина № 1, Пример № 5 в моем Ответе ...

avatar
Chezzwizz
21 мая 2017 в 08:09
4

При запуске 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 правильно обрабатывать аргументы пути к классам.

avatar
user6419437
12 мая 2017 в 16:12
0

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

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

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

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

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

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

avatar
developer747
26 марта 2017 в 21:17
6

enter image description here

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

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

Полное имя класса: com.company.Main

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

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

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

avatar
shaILU
23 февраля 2017 в 07:51
22

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

java -cp . [PACKAGE.]CLASSNAME

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

java -cp . Hello

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

java -cp . com.demo.Hello

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

Stephen C
23 февраля 2017 в 11:46
0

Это работает только в простых случаях. Более сложные случаи требуют более сложного пути к классам.

Stephen C
7 марта 2017 в 03:37
0

И для >> действительно << простых случаев -cp . не нужен, потому что, если $CLASSPATH не задано, то . - путь к классам по умолчанию.

shaILU
5 мая 2017 в 07:18
0

Нет, Стивен, во многих случаях путь к классам по умолчанию в Windows не работает. Я пробовал это на трех разных машинах, вы тоже можете попробовать.

Stephen C
5 мая 2017 в 07:24
0

Вероятно, это потому, что вы действительно где-то установили переменную среды% CLASSPATH%. Если вы это сделаете, значит, вы не используете путь к классам по умолчанию. (Что выводит echo %CLASSPATH%?) И нет, я не могу проверить, потому что у меня нет ПК с Windows.

Stephen C
5 мая 2017 в 07:27
0

В официальном руководстве Oracle для команды "java" (версия для Windows) говорится следующее: "Если -classpath и -cp не используются и CLASSPATH не задан, то путь к классу пользователя состоит из текущего каталог (.). " Ссылка - docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

shaILU
5 мая 2017 в 07:37
0

Да, в общем, когда вы устанавливаете такие инструменты, как Websphere MQ или erlang и т. Д., Которые сейчас распространены, CLASSPATH создает как переменную среды. Вот почему парень, задавший этот вопрос, возможно, не сможет скомпилировать.

Stephen C
5 мая 2017 в 07:59
0

Нет никакого «парня». Это было написано (мной!) Как общие вопросы и ответы, предназначенные для обучения людей, чтобы они понимали причину проблемы и знали, как ее исправить. Простые ответы «сделай это, и это может сработать» (ИМО) бесполезны, потому что они побуждают людей не тратить время на изучение и понимание

SnuKies
9 июля 2019 в 14:49
2

У меня это сработало, когда я попытался запустить простую программу из командной строки.

avatar
Addison
23 февраля 2017 в 06:59
-1

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

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

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

Stephen C
23 февраля 2017 в 07:05
3

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

Stephen C
23 февраля 2017 в 11:48
3

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

avatar
Rahul Raghuvanshi
7 февраля 2017 в 13:25
-2

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

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

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

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

java ConnectionExample <args>

Он работал отлично.

Stephen C
23 февраля 2017 в 07:03
1

Это не удастся, если вы не находитесь в каталоге, в котором вы скомпилировали классы.

avatar
blue-sky
4 октября 2016 в 16:08
6

Кажется, все ответы здесь адресованы пользователям Windows. Для Mac разделителем пути к классам является :, а не ;. Поскольку при установке пути к классам с использованием ; ошибка не выбрасывается, это может быть трудно обнаружить при переходе с Windows на Mac.

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

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

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

Alex78191
4 октября 2017 в 21:03
2

В Linux так же, как и на Mac.

Alex78191
4 октября 2017 в 21:03
0

Зачем нужен /*?

Stephen C
21 мая 2019 в 22:45
0

Это синтаксис с подстановочными знаками. (Это не обязательно. Вы можете явно указать JAR-файлы, если хотите.)

avatar
Yamahar1sp
22 сентября 2016 в 07:35
20

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

java -cp lib.jar com.mypackage.Main

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

java -cp lib.jar; com.mypackage.Main
Stephen C
22 сентября 2016 в 07:58
0

да. Скорее всего, потому, что вашего Main нет в файле JAR. -cp lib.jar; означает то же самое, что и -cp lib.jar;., т.е. текущий каталог включен в путь к классам.

Vicky
24 января 2019 в 05:35
0

Наконец-то исправлена ​​проблема для unix .. спасибо (работает с :)

avatar
jan.supol
24 августа 2016 в 08:13
20

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

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

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

avatar
Mike. D
15 июня 2016 в 11:13
4

Вам действительно нужно сделать это из папки 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
Stephen C
25 июля 2016 в 07:38
2

Класс нельзя назвать «CommandLine.class». Это было бы синтаксической ошибкой Java. (Вы имеете в виду, что файл, содержащий скомпилированный класс, называется "CommandLine.class" ...). Другая проблема заключается в том, что ваша инструкция «cd to the source directory» работает только в том случае, если вы скомпилировали код >> в << дерево исходных каталогов. Наконец, если в вашей компиляции использовался аргумент «-cp», вам понадобится эквивалент при запуске.

tamj0rd2
21 июля 2017 в 12:28
0

В моем проекте у меня есть папка src и папка bin в корне. Мне пришлось ввести cd в src, а затем запустить команду java ../bin com.blah.blah.MyClass, которая сработала для меня. Так что спасибо за подсказку!

avatar
Anus Kaleem
4 июня 2016 в 17:04
2

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

  • Во-первых, я столкнулся с несколькими методами main в разных классах моего проекта. Итак, я удалил метод main из последующих классов.
  • Во-вторых, я попробовал следующее решение:
    1. Щелкните правой кнопкой мыши на моем основном каталоге проекта.
    2. Направляйтесь к источнику, затем очистите, оставьте настройки по умолчанию и нажмите «Готово». После выполнения некоторых фоновых задач вы будете перенаправлены в основной каталог вашего проекта.
    3. После этого я закрываю свой проект, снова открываю его и бум, я наконец решил свою проблему.
Stephen C
27 января 2017 в 23:38
1

Удаление методов main не решит проблему. Нет ничего технически неправильного в приложении, имеющем несколько точек входа.

avatar
syntagma
16 января 2016 в 10:26
5

Что решило проблему в моем случае:

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

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

avatar
GuiRitter
27 декабря 2015 в 00:26
5

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

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

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

avatar
Jaanus
14 декабря 2015 в 14:14
2

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

Пришлось изменить строки в .classpath с

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

до

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
avatar
Nenad Bulatovic
24 октября 2015 в 21:18
5

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

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

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

Stephen C
8 ноября 2015 в 03:41
1

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

avatar
Anandaraja Ravi
18 сентября 2015 в 03:01
4

В 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/

Stephen C
18 сентября 2015 в 07:53
1

Вы прочитали принятый ответ? Ваш ответ добавляет что-нибудь новое?

humkins
22 июня 2017 в 12:10
2

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

avatar
Devs love ZenUML
17 сентября 2015 в 01:35
29

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

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

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

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

Например:

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

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

Stephen C
17 сентября 2015 в 01:44
0

«В основном» есть и другие категории. Проблема с отсутствующим суперклассом - очень необычный случай. (Настолько необычно, что я никогда не видел этого ... в вопросах, задаваемых на этом сайте.)

Devs love ZenUML
17 сентября 2015 в 01:55
0

Их ДВА, потому что ошибка говорит: «Не удалось НАЙТИ или ЗАГРУЗИТЬ основной класс». Если есть другие категории, сообщите, пожалуйста. Я видел это, поэтому просто хочу поделиться им здесь, может быть, это понадобится кому-то другому.

Stephen C
17 сентября 2015 в 02:42
0

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

Devs love ZenUML
17 сентября 2015 в 03:39
0

Ваш ответ хорош. Я прочитал и собираюсь прочитать ссылки. Спасибо! Он довольно хорошо покрывает первый пункт. Что касается второго пункта, я думаю, что он не совсем правильный (очень рад, если я ошибаюсь). В своем ответе вы сказали: «Путь к классам должен включать все другие (несистемные) классы». На самом деле, чтобы избежать ошибки, в этом нет необходимости. Будут другие ошибки и исключения (например, NullPionter), но вы не увидите «Coud не найдет или не загрузит основной класс», пока основной класс найден и загружен.

Stephen C
17 сентября 2015 в 04:30
0

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

Devs love ZenUML
17 сентября 2015 в 04:54
0

Я имел в виду, что в некоторых (большинстве) случаев вы не видите ЭТОЙ ошибки, когда зависимости не указаны в пути к классам. Возможно, вы захотите пересмотреть «Путь к классам должен включать все другие классы». Полностью зависит от вас. Не обидно.

Stephen C
17 сентября 2015 в 07:26
0

Но факт остается фактом: путь к классам ДОЛЖЕН включать все другие классы. Утверждение верно, и вы не убедили меня, что есть какая-то ценность в его пересмотре. (В самом деле, если вы подумаете об этом, если бы я изменил его, чтобы сказать что-то вроде «Вам не нужны >> все << классов в пути к классам, чтобы избежать этой конкретной ошибки, но в некоторых случаях вы получите разные ошибки, поэтому вы все равно лучше надеть их. "... тогда типичный читатель этого ответа, вероятно, запутается еще больше, чем он / она уже есть.)

Devs love ZenUML
17 сентября 2015 в 11:07
2

Я бы изменил его на что-то вроде «Вам нужно включить все классы, которые требуются для запуска основного класса, чтобы избежать этой конкретной ошибки». Я не пытаюсь вас убедить. Это просто путь, который я хотел бы увидеть. Я оставил ответ здесь только для людей, которым может понравиться читать подобным образом. Давайте не будем распространять это обсуждение дальше :) Я изменил свое утверждение на «не полностью обсуждено в принятом ответе» и надеюсь, что вы почувствуете себя лучше.

Hugues M.
31 мая 2017 в 13:37
6

Эта информация имеет решающее значение и заслуживает отдельного упоминания (это единственный ответ, в котором упоминается extends). Я только что на собственном опыте узнал, что, когда основной класс не может загрузить , потому что он расширяет другой, который не может быть найден , java не сообщает, какой фактический класс не был найден (в отличие от NoClassDefFoundError). Так что да, это действительно происходит, и это непростая ситуация, когда вы этого не знаете.

Carlos A. Ibarra
2 марта 2018 в 13:23
1

В этой ситуации есть ли способ точно определить, какой класс зависимости не загружается?

Oleg Kurbatov
14 ноября 2018 в 12:58
0

@carlos Использование флага -Xdiag может дать вам подсказку.

avatar
mathewbruens
2 сентября 2015 в 05:58
6

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

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

вместо:

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

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

Stephen C
2 сентября 2015 в 07:44
0

Я обновил свой ответ, чтобы попытаться устранить эту путаницу.

user207421
7 февраля 2018 в 08:15
3

Ни то, ни другое неверно. Класс должен быть указан как utilities.myapp.Cool или любое другое имя его пакета, если таковое имеется.

avatar
Enamul Hassan
21 августа 2015 в 06:58
59

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

javac HelloWorld.java
java -cp . HelloWorld
Stephen C
22 августа 2015 в 06:20
2

Это не очень хорошая рекомендация. Вы зависите от того, не задана ли переменная среды CLASSPATH или имеет значение, соответствующее символу ".". Да, во многих случаях это работает, в других - нет.

Stephen C
22 августа 2015 в 10:15
0

Ну конечно javac -classpath . HelloWorld.java ​​сработало бы! И это лучшее решение в вашем случае.

Joe
12 марта 2018 в 20:06
2

Если у вас в первой строке указано package com.some.address - это не сработает. Вам нужно будет прокомментировать «адрес пакета».

Stephen C
26 апреля 2019 в 02:40
1

@Joe - Этот хак (комментирование пакета) будет работать (в некоторых случаях), но это плохая идея. Лучшая идея - узнать / понять, что вызвало проблему, и реализовать правильное решение.

Amila Weerasinghe
11 декабря 2020 в 07:33
0

отключение переменной пути к классам в основном сработало для меня.

avatar
Nathan Williams
30 июня 2015 в 07:56
10

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

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

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

Stephen C
30 июня 2015 в 09:18
2

Ух ты! Это совершенно странная причина! (Но он служит вам для использования Блокнота вместо настоящего текстового редактора :-))

avatar
tharinduwijewardane
6 марта 2015 в 03:20
161

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

Пример:

Мои классы здесь:

D:\project\com\cse\

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

com.cse.Main

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

D:\project

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

java com.cse.Main

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

Stephen C
6 марта 2015 в 07:27
2

Этот ответ состоит из множества предположений. Есть и другие способы добиться этого. Вместо того, чтобы слепо следовать приведенному выше совету, я бы порекомендовал людям найти время, чтобы прочитать ссылки в моем ответе, которые объясняют, как работает путь к классам Java. Лучше ПОНИМАТЬ, что делаешь ...

Nick Constantine
14 апреля 2019 в 01:44
5

Этот ответ делает точные предположения, которые мне нужны :) Я находился в каталоге файла .class, и java.exe не работал. Как только я сделал cd-ed выше и запустил с именем пакета, включенным в командную строку, все заработало.

Tihamer
20 августа 2020 в 22:19
2

Я согласен с Ником Константином. То же самое. Это был точный пример того, что я сделал, и он тоже сработал для меня. Обработка пути к классам java имеет определенную логику, но я бы точно не спроектировал ее таким образом.

Hernaldo Gonzalez
20 сентября 2021 в 15:26
0

Спасибо, ваш ответ помог мне понять, что я использовал Main с верхним регистром _ !

Matuagkeetarp
15 ноября 2021 в 14:48
0

Я пишу этот комментарий после того, как попробовал это, но это не сработало. У меня есть проект под названием Helloworld, который состоит только из 1 файла java, Helloworld / src / com / firstpackage / Test.java (windows 10. intellij idea). У меня нет переменной окружения CLASSPATH, я хочу установить путь к классам специально для этого проекта. запуск java com.firstpackage.Test внутри каталога Helloworld не работает, и команда java -classpath C:\Users\matuagkeetarp\IdeaProjects\Helloworld\src\com\first‌​package Test.java также не устанавливает переменную пути к классам. Вы можете помочь?

avatar
M-Razavi
27 октября 2014 в 12:07
79

С пакетом

Если у вас есть ключевое слово 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 в пакет, например, каталог:

C: \ Users \ workspace \ testapp \ com \ test \ Main.Java

Затем измените текущий каталог терминала на корневой каталог проекта:

cd C:\Users\workspace\testapp  

И, наконец, введите код:

java com.test.Main

Без упаковки

Если у вас нет пакета с именем вашего исходного кода, возможно, вы ошиблись с неправильной командой. Предположим, что имя вашего java-файла Main.java, после компиляции:

javac Main.java

ваш скомпилированный код будет Main.class

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

java Main.class

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

java Main
Stephen C
27 октября 2014 в 13:16
1

См. «Дополнительные примечания №1» моего ответа. Для лучшего объяснения этой проблемы.

kmort
29 октября 2014 в 19:02
14

@StephenC Да, ваш ответ более полный (и, конечно, +1), но в этом конкретном ответе было слово «пакет», что позволило мне быстро найти то, что мне нужно. И это сработало. Итак +1 Разави. StephenC, у вас отсутствует простой пример пакета, который мне нужен, поскольку я новичок в Java.

John
17 марта 2015 в 19:05
6

Это была моя проблема. Я пробирался через тонны документов Java, и этот конкретный пример - то, что мне нужно

M-Razavi
3 августа 2015 в 07:19
0

Лучше сделать Runnable JAR File для выполнения файла класса.

Pixel
9 мая 2018 в 07:11
1

Да, конкретный пример хорош, это отлично сработало. Я уверен, что основной ответ очень обстоятельный, но за лесом дерево было трудно увидеть. Хорошенький @Razavi

M o
18 апреля 2019 в 19:29
1

Мне нравится этот более короткий и полезный ответ вместо принятого!

logbasex
5 января 2021 в 12:59
0

Ух ты! Спасибо.

Maf
31 марта 2021 в 22:07
0

Очень хорошо объяснено. Большое спасибо. У меня это сработало.

avatar
Celebes
2 июля 2014 в 11:11
40

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

  1. Создать новую папку, C:\temp

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

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

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

    java -classpath C:\temp Temp Hello!
    
gone
30 сентября 2014 в 14:21
3

В Ubuntu мне также пришлось указать путь. Не понимаю, почему он не может использовать текущий рабочий каталог по умолчанию. Я убежден, что Java спонсируется производителями клавиатур !!

Stephen C
30 июня 2015 в 09:24
1

@gone - Причина, по которой "." не входит в $ PATH по умолчанию, потому что это ловушка безопасности. sea.upenn.edu/cets/answers/dot-path.html

akash89
1 сентября 2015 в 16:58
0

Большое спасибо за это ... даже при том, что не уверен, почему java не смогла узнать путь к классам даже после установки его в переменных среды.

Stephen C
15 марта 2016 в 13:14
0

@ akash89 - Наиболее вероятными причинами были: 1) java не смотрел на $ CLASSPATH (потому что вы использовали -classpath или -jar) или 2) параметр пути к классам не был установлен в среде, которая не была в эффект в контексте, в котором java был запущен; например потому что вы не «исходили» из файла, в который были добавлены команды setenv в правой оболочке.

Alaa Jabre
28 мая 2017 в 11:14
0

У меня все еще есть ошибка: не удалось найти или загрузить основной класс Temp, может кто-нибудь помочь!

surfmuggle
4 мая 2021 в 22:11
0

Под окнами с использованием classpath, подобного этому, java -classpath c:\folder\subfoler\myCodeFolder Main также работал у меня для запуска Main.class.

avatar
panoet
21 мая 2014 в 11:06
270

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

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

java HelloWorld.class

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

java HelloWorld
Stephen C
29 сентября 2015 в 06:17
4

Проблема в том, что это решение работает только для классов Java, объявленных в пакете по умолчанию, без зависимостей файлов JAR. (И даже тогда не всегда.) Большинство программ на Java не так просты.

Someone Somewhere
3 января 2016 в 17:12
2

как сказал Стивен, это работает только с «пакетом по умолчанию» - что означает без объявления пакета в верхней части файла. Для быстрого тестирования кода я сделал: javac TestCode.java, за которым следует java TestCode

Jim
5 августа 2016 в 19:41
0

У меня это не сработало. Он по-прежнему говорит: «Не удалось найти или загрузить основной класс HelloWorld».

BMaximus
7 декабря 2016 в 08:11
0

java -jar HelloWorld.jar также является вариантом

Chris Prince
31 января 2017 в 23:34
21

Мне нужно было сделать java -classpath . HelloWorld

Stephen C
8 сентября 2017 в 05:09
0

@ Джим - ты читал мой комментарий? Если это не сработает, значит, одно или несколько предварительных условий не выполнены. Посмотрите на ответ, получивший наибольшее количество голосов.

Stephen C
8 сентября 2017 в 05:10
0

@ChrisPrince - Да ... это срабатывает ... иногда. Чтобы понять, когда это работает, а когда нет, прочитайте ответ, получивший наибольшее количество голосов.

Stephen C
8 сентября 2017 в 05:11
0

@BMaximus - это вариант, только если у вас есть исполняемый файл JAR ...

avatar
KawaiKx
12 марта 2014 в 00:37
9

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

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

Stephen C
12 марта 2014 в 03:55
0

да. См. Мой пример №2 неправильного указания имени класса !!

avatar
arun
2 декабря 2013 в 14:05
4

Сначала задайте путь с помощью этой команды;

set path="paste the set path address"

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

Stephen C
2 декабря 2013 в 15:42
5

Это не помогает. Этот вопрос касается программ Java, а не обычных исполняемых файлов. Java не использует PATH для поиска чего-либо, и если "cd" помогает, то это скорее удача, чем оценка.

GKFX
31 марта 2014 в 15:16
0

if "cd" helps then it by luck rather than by judgement. Это неправильно (я считаю), поскольку java по умолчанию использует текущий каталог . как часть пути к классам.

Stephen C
12 июня 2014 в 06:05
3

@GKFX - Вот что я имею в виду. Если вы не знаете, что используете путь к классам по умолчанию (или путь к классам с "." На нем), "cd" не будет иметь никакого эффекта. Это решение работает скорее благодаря удаче (т.е. угадыванию / надежде, что "." Находится в пути к классам), чем по суждению (т.е. проверке того, что "." Находится в пути к классам). Кроме того, вы ошиблись по поводу значения по умолчанию. Java использует "." как путь к классам по умолчанию, а не как часть пути к классам по умолчанию.

avatar
Eduardo Dennis
1 ноября 2013 в 18:04
16

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

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

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

Stephen C
2 ноября 2013 в 00:13
1

Похоже, проблема заключалась в том, что у вас был неправильный путь к классам из-за неработающей «ссылки» в вашем проекте в вашей среде IDE. Я обновлю свой ответ, чтобы охватить этот случай.

Aquarius Power
7 ноября 2016 в 21:00
0

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

Stephen C
7 ноября 2016 в 22:42
0

@AquariusPower - Должна была быть дополнительная трассировка стека «вызвано» для исключения «причина», в котором указано, что какой-то класс отсутствует. Если вы хотите предложить разработчикам Java изменить сообщение об ошибке, в котором говорилось, что это уже более 20 лет ... не стесняйтесь. (Я думаю, что сообщение об ошибке правильное. Проблема заключалась в том, что >> вы << сузили неправильное предложение.)

Aquarius Power
8 ноября 2016 в 01:57
0

@StephenC я имел в виду, что у них наверняка есть доступ к информации, доступен ли основной файл класса или нет, так почему бы не показать нам лучшее сообщение об ошибке, в котором говорится, что такой файл отсутствует. С другой стороны, они также могут сказать: «Файл найден, но не может быть загружен» в этот момент, и мы сразу же сосредоточимся на зависимостях, вместо того, чтобы терять полдня на изучение и тестирование вещей, чтобы понять. Я как раз это имел в виду :). Они могут делать это ограниченным образом в течение 20 с лишним лет, но они могут улучшить это, и мы здесь, чтобы гарантировать, что это произойдет благодаря нашей критике и жалобам! : D

Stephen C
8 ноября 2016 в 02:19
0

Пожалуйста, поймите, что имел в виду >> I <<. Жаловаться на это в каком-то непонятном комментарии к вопросам и ответам трехлетней давности ничего не добьешься. Люди, которые могли бы разумно отреагировать на ваши жалобы, этого не заметят. Если вы хотите сделать что-то конструктивное, отправьте патч. (Я не оцениваю ваши шансы, но они будут больше, чем если бы вы просто жаловались на это.)