запуск java-файла в unix [duplicate]

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

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

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

918
задан Stephen C 7 January 2018 в 07:58
поделиться

17 ответов

866
ответ дан Stephen C 16 August 2018 в 11:13
поделиться

В 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 -на-нашли или загружено /

1
ответ дан Anandaraja Ravi 16 August 2018 в 11:13
поделиться
  • 1
    Вы читали принятый ответ? Ваш ответ добавляет что-то новое? – Stephen C 18 September 2015 в 07:53
  • 2
    @StephenC Я попытался найти причину в вашем списке, посмотрев на «Reason & quot; категорий и их точек. Я не мог найти подходящую точку в «Причина № 1». и "Причина № 2" название не было близко к моему делу (потому что я был уверен, что нет проблем с самим классом). Я нашел причину, выполнив эксперименты, и я был удивлен, что в моем случае «основной класс не найден». была показана ошибка, поскольку интерфейс реализации не был включен в путь класса. Конечно, вы можете сказать «вы должны прочитать все, что описано в сообщении». но мне кажется, что ваш список причин можно улучшить. – gumkins 22 June 2017 в 12:10

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

2
ответ дан Chezzwizz 16 August 2018 в 11:13
поделиться

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

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

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

Командная строка:

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

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

4
ответ дан developer747 16 August 2018 в 11:13
поделиться

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

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

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

3
ответ дан GuiRitter 16 August 2018 в 11:13
поделиться

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

1
ответ дан Howard007 16 August 2018 в 11:13
поделиться

Я получил эту ошибку после выполнения 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
ответ дан Jaanus 16 August 2018 в 11:13
поделиться

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

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

5
ответ дан KawaiKx 16 August 2018 в 11:13
поделиться
  • 1
    Да. См. Мой пример # 2 неправильных способов указать имя класса! – Stephen C 12 March 2014 в 05:55

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

Предположим, что есть файл исходного кода (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.

43
ответ дан Kenster 16 August 2018 в 11:13
поделиться
  • 1
    См. «Дополнительные примечания № 1». моего ответа. Для лучшего объяснения этой проблемы. – Stephen C 27 October 2014 в 14:16
  • 2
    @StephenC Да, ваш ответ более полный (и, конечно, +1), но этот конкретный ответ имел слово «пакет». в нем, что позволило мне быстро найти то, что мне нужно. И это сработало. Итак, +1 Разави. StephenC, у вас отсутствует простой пример пакета, который мне нужен, поскольку я новичок в Java. – kmort 29 October 2014 в 20:02
  • 3
    Это была моя проблема. Я пробирался сквозь тонны Java-документа, и этот конкретный пример - то, что мне нужно – user2044223 17 March 2015 в 20:05
  • 4
    Лучше сделать «Runnable JAR File» для выполнения файла класса. – Razavi 3 August 2015 в 07:19
  • 5
    Да, конкретный пример хорош, это сработало отлично. Я уверен, что главный ответ очень тщательный, но было трудно увидеть дерево для леса. Ницца @ Разави – Antinous 9 May 2018 в 07:11

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

2
ответ дан lor 16 August 2018 в 11:13
поделиться
  • 1
    Примеры (оскорбительных компиляторов), пожалуйста. Хотя обычным / нормальным является «точка входа», class public, спецификации Java не требуют этого, и также не используется стандартная команда Oracle / OpenJDK java. – Stephen C 23 July 2018 в 22:42

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

set path="paste the set path address"

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

3
ответ дан Louis van Tonder 16 August 2018 в 11:13
поделиться
  • 1
    Это не помогает. Этот вопрос касается программ Java, а не обычных исполняемых файлов. Java не использует PATH для поиска чего-либо, и если & quot; cd & quot; помогает тогда это скорее удачей, чем суждением. – Stephen C 2 December 2013 в 17:42
  • 2
    if "cd" helps then it by luck rather than by judgement. Это неверно (я считаю), поскольку java использует текущий каталог . как часть пути к классам по умолчанию. – GKFX 31 March 2014 в 16:16
  • 3
    @GKFX - Вот что я имею в виду. Если вы не знаете, что используете путь по умолчанию (или путь к классу с & quot ;. & quot; на нем), "cd & quot; не будет иметь никакого эффекта. Это решение работает больше на удачу (то есть, предполагая / надеясь, что «.» Находится на пути к классу), чем по суждению (то есть проверка того, что «.» Находится на пути к классу). Кроме того, вы неверны по умолчанию. Java использует & quot;. & Quot; как classpath по умолчанию, а не как часть пути к классам по умолчанию. – Stephen C 12 June 2014 в 07:05

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

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

java HelloWorld.class

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

java HelloWorld
187
ответ дан Paolo Forgia 16 August 2018 в 11:13
поделиться
  • 1
    Проблема в том, что это решение работает только для классов Java, объявленных в пакете по умолчанию без зависимостей JAR-файла. (И даже тогда, не все время.) Большинство программ Java не так просто. – Stephen C 29 September 2015 в 06:17
  • 2
    как сказал Стивен, это работает только с "пакетом по умолчанию" - что означает no объявление пакета в верхней части файла. Для быстрой проверки некоторого кода я сделал: javac TestCode.java, а затем java TestCode – Someone Somewhere 3 January 2016 в 18:12
  • 3
    Это не сработало для меня. Он по-прежнему говорит: «Не удалось найти или загрузить главный класс HelloWorld», – Jim 5 August 2016 в 19:41
  • 4
    java -jar HelloWorld.jar также является опцией – BMaximus 7 December 2016 в 09:11
  • 5
    Мне нужно было сделать java -classpath . HelloWorld – Chris Prince 1 February 2017 в 00:34

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

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

Скомпилировать:

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

Run:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Пожалуйста, наблюдайте за двоеточием (Unix) / запятой (Windows) после того, как все файлы JAR зависимой записи завершатся
  • В конце обратите внимание на имя основного класса без какого-либо расширения (нет .class или .java)
96
ответ дан Peter Mortensen 16 August 2018 в 11:13
поделиться
  • 1
    Похоже, проблема заключалась в том, что у вас был неправильный путь класса из-за сломанной «ссылки». в вашем проекте в среде IDE. Я обновлю свой ответ, чтобы рассмотреть этот случай. – Stephen C 2 November 2013 в 02:13
  • 2
    В Ubuntu мне также пришлось указать путь. Не понимаю, почему он не может использовать текущий рабочий каталог по умолчанию. Я убежден, что Java спонсируется производителями клавиатуры! – gone 30 September 2014 в 15:21
  • 3
    Этот ответ дает массу предположений. И есть другие способы добиться этого. Вместо того, чтобы слепо следовать приведенному выше совету, я бы рекомендовал, чтобы люди нашли время, чтобы прочитать ссылки в моем ответе, которые объясняют, как работает класс Java. Лучше ПОНИМАТЬ, что вы делаете ... – Stephen C 6 March 2015 в 08:27
  • 4
    Вау! Это совершенно странная причина! (Но он служит вам для использования Notepad вместо реального текстового редактора :-)) – Stephen C 30 June 2015 в 09:18
  • 5
    @gone - Причина, по которой «.» не находится в $ PATH по умолчанию, так это то, что это ловушка безопасности. seas.upenn.edu/cets/answers/dot-path.html – Stephen C 30 June 2015 в 09:24
  • 6
    Это не очень хорошая рекомендация. Вы зависите от переменной среды CLASSPATH, которая не установлена ​​или имеет значение, соответствующее «.». Да, он работает во многих случаях, но в других он не будет. – Stephen C 22 August 2015 в 06:20
  • 7
    Ну конечно javac -classpath . HelloWorld.java сработало бы! И это лучшее решение в вашем случае. – Stephen C 22 August 2015 в 10:15
  • 8
    Большое спасибо за это ... хотя и не уверен, почему Java не смог узнать путь к классам даже после установки в переменных среды. – akash89 1 September 2015 в 16:58
  • 9
    Этот совет может или не поможет. Это поможет, если дерево классов содержит классы в текущем каталоге. Это не так, если они не будут. На самом деле я бы этого не сделал. Вместо этого я бы создал сценарий оболочки с одним слоем, который работал независимо от того, находится ли пользователь в правом правиле. каталог. – Stephen C 8 November 2015 в 04:41
  • 10
    @ akash89 - Наиболее вероятными причинами были: 1) java не смотрел $ CLASSPATH (потому что вы использовали -classpath или -jar) или 2) параметр classpath не был установлен в среде, которая не была в эффект в контексте выполнения java; например потому что вы не "источник" файл, в который добавлены команды setenv в правой оболочке. – Stephen C 15 March 2016 в 14:14
  • 11
    Класс нельзя назвать «CommandLine.class». Это будет синтаксическая ошибка Java. (Вы имеете в виду, что файл, содержащий скомпилированный класс, называется «CommandLine.class» ...). Другая проблема заключается в том, что ваша команда на "cd в исходный каталог" работает только если вы скомпилировали код & gt; & gt; & gt; & lt; & lt; исходное дерево каталогов. Наконец, если ваш компилятор использовал & quot; -cp & quot; аргумент, тогда вам понадобится эквивалент при запуске. – Stephen C 25 July 2016 в 07:38
  • 12
    Я использую Debian 8, и это сработало. Не знаю, почему. – Frankline 23 August 2016 в 04:33
  • 13
    Да. Это наиболее вероятно, потому что ваш Main не находится в файле JAR. -cp lib.jar; означает то же, что и -cp lib.jar;., то есть текущий каталог включен в путь к классам. – Stephen C 22 September 2016 в 07:58
  • 14
    @StephenC и EduardoDennis. Было и то, что здесь тоже не хватало бана, что в банке был интерфейс, от которого зависел основной класс. Таким образом, сообщение об ошибке слишком велико. Я должен сказать, что «не смог найти». если файл класса не найден и «не может загрузить (отсутствующие зависимости)», если есть что-то еще, но не сам файл, поэтому сообщение об ошибке слишком велико, если вы фокусируетесь только на «найти», Часть этого :( – Aquarius Power 7 November 2016 в 22:00
  • 15
    @AquariusPower - Должна была быть дополнительная "вызвана" stacktrace для "причины" исключение, в котором отсутствует класс wht. Если вы хотите предложить разработчикам Java, что они изменяют сообщение об ошибке, которое говорит, что в течение 20 лет ... не стесняйтесь. (Я думаю, что сообщение об ошибке правильное. Проблема заключалась в том, что & gt; & gt; & gt; & lt; & lt; & lt; сузился в неправильном разделе.) – Stephen C 7 November 2016 в 23:42
  • 16
    @StephenC, что я имел в виду, они, безусловно, имеют доступ к информации, если файл основного класса доступен или нет, поэтому почему бы не показать нам лучшее сообщение об ошибке, в котором говорится, что такой файл отсутствует. С другой стороны, они также могли бы сказать «Файл найден, но не может быть загружен». в этот момент мы бы стремились сосредоточиться на зависимости вместо того, чтобы потерять полдня, исследуя и тестируя вещи, чтобы понять. Просто я имел в виду :). Они могут делать это ограниченным образом в течение 20 + лет, но они могут улучшить его, и мы здесь, чтобы предоставить, что произойдет через нашу критику и жалобы! : D – Aquarius Power 8 November 2016 в 02:57
  • 17
    Пожалуйста, поймите, что & gt; & gt; I & lt; имел ввиду. Жалуясь на это в некотором неясном комментарии к 3-летнему Q & amp; A, он ничего не добьется. Люди, которые могли бы согласиться на ваши жалобы, не заметят этого. Если вы хотите сделать что-то конструктивное, отправьте патч. (Я не оцениваю ваши шансы, но они будут больше, чем если бы вы просто болтали об этом.) – Stephen C 8 November 2016 в 03:19
  • 18
    Это работает только в простых случаях. Для более сложных случаев требуется более сложный путь к классам. – Stephen C 23 February 2017 в 12:46
  • 19
    И для & gt; & gt; действительно & lt; простые случаи, -cp . не требуется, потому что если $CLASSPATH не задано, то . - это путь по умолчанию. – Stephen C 7 March 2017 в 04:37
  • 20
    Нет, Стивен, много раз в Windows class classpath не работает. Я попробовал это на трех разных машинах, вы также можете попробовать это. – shaILU 5 May 2017 в 07:18
  • 21
    Вероятно, это потому, что вы фактически установили переменную среды% CLASSPATH%. Если вы это сделаете, то вы не используете путь по умолчанию. (Что делает выход echo %CLASSPATH%?) И нет, я не могу проверить, потому что у меня нет ПК с ОС Windows. – Stephen C 5 May 2017 в 07:24
  • 22
    Официальная запись Oracle для «java» (версия Windows) говорит следующее: & quot; Если -classpath и -cp не используются, а CLASSPATH не задано, то путь к пользовательскому классу состоит из текущего каталога (.). & quot; Ссылка - docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html – Stephen C 5 May 2017 в 07:27
  • 23
    В моем проекте у меня есть папка src и bin в корне. Я должен был cd в src, а затем запустить команду java ../bin com.blah.blah.MyClass, которая работала для меня. Так что спасибо за подсказку! – tamj0rd2 21 July 2017 в 12:28
  • 24
    Однако вы не получите вышеупомянутые сообщения об ошибках, если попытаетесь запустить приложение без надлежащего main из среды IDE. (И для некоторых IDE вам не нужно настроить панель запуска, чтобы это произошло, например, run Eclipse будет найти класс с методом main для вы. – Stephen C 22 August 2017 в 04:52
  • 25
    Фактически, если вы запустите приложение без этого параметра, вы получите точное сообщение в исходном вопросе: Could not find or load main class .... Вот как я приехал на этот пост :) – cepix 22 August 2017 в 17:41
  • 26
    Не в Eclipse вы не будете. В Eclipse, если среда IDE не может идентифицировать ни один из классов с main, вам просто не предлагается опция «Использовать и использовать Java» в контекстном меню. – Stephen C 22 August 2017 в 22:44
  • 27
    Это происходит потому, что вы выполняете скомпилированную версию вашего .java. Фактически выполняется файл .class – Jason V 20 September 2017 в 16:30
  • 28
    На Linux, как и на Mac. – Alex78191 4 October 2017 в 21:03
  • 29
    Почему /* необходим? – Alex78191 4 October 2017 в 21:03
  • 30
    Для записи это то же самое, что причина № 1, пример № 5 в моем ответе ... – Stephen C 30 October 2017 в 01:50
  • 31
    Все это предполагает, что 1) JavaMongoDBConnection не имеет пакета, и 2) вы не меняете каталог. Это, мягко говоря, хрупкое. И, не объясняя проблемы, он заставит новичков попробовать этот подход в ситуациях, когда он не будет работать . Короче говоря, он поощряет «методы программирования вуду»: ru.wikipedia.org/wiki/Voodoo_programming – Stephen C 27 January 2018 в 01:25
  • 32
    Это решило непосредственную проблему, поэтому я говорю, что это хорошо. – Chris Reid 2 February 2018 в 22:54
  • 33
    Если у вас есть пакет com.some.address в качестве первой строки, это не сработает. Вам нужно будет прокомментировать «адрес пакета». – Joe 12 March 2018 в 21:06
  • 34
    Спасибо, это было очень полезно. Несмотря на то, что я занимаюсь Java уже много лет, я не знал этого варианта. – Johannes Jander 6 April 2018 в 21:02
  • 35
    Это помогло мне и работало :) – Qadir Hussain 25 June 2018 в 07:09

Исправлена ​​проблема в моем случае:

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

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

3
ответ дан syntagma 16 August 2018 в 11:13
поделиться

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

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

вместо:

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

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

4
ответ дан user207421 16 August 2018 в 11:13
поделиться
  • 1
    Я обновил свой ответ, чтобы попытаться устранить эту путаницу. – Stephen C 2 September 2015 в 07:44
  • 2
    Ни один из них не является правильным. Класс должен быть указан как utilities.myapp.Cool или независимо от его имени пакета, если таковой имеется. – user207421 7 February 2018 в 09:15

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

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

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

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

Например:

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

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

20
ответ дан Xiao Peng - ZenUML.com 16 August 2018 в 11:13
поделиться
  • 1
    & Quot; В основном & Quot; есть много других категорий. И недостающая проблема суперкласса - очень необычный подзаголовок. (Так необычно, что я никогда его не видел ... в вопросах, заданных на этом сайте.) – Stephen C 17 September 2015 в 01:44
  • 2
    Есть два, потому что ошибка говорит «Не удалось найти или загрузить основной класс». Если есть другие категории, пожалуйста, сообщите мне. Я видел это, так что просто хочу поделиться им здесь, может быть, кому-то это понадобится. – Xiao Peng - ZenUML.com 17 September 2015 в 01:55
  • 3
    Да. Я это понимаю. Но вы прочитали мой ответ? Разве он не охватывает все случаи, о которых вы говорили? На самом деле я хочу сказать, что ваш ответ не добавляет ничего нового ... и поскольку он не учитывает многие другие причины, на самом деле это будет препятствием для многих читателей. – Stephen C 17 September 2015 в 02:42
  • 4
    Эта информация имеет решающее значение и заслуживает явного упоминания (это единственный ответ, который упоминает extends). Я только что усвоил, что, когда основной класс не может загрузить , потому что он расширяет другую, которая не может быть найдена , java не сообщает, какой фактический класс был не найден (в отличие от NoClassDefFoundError). Так что да, это случается, и это ситуация с волосами, когда вы этого не знаете. – Hugues M. 31 May 2017 в 13:37
  • 5
    В этой ситуации можно ли точно указать, какой класс зависимостей не загружается? – Carlos A. Ibarra 2 March 2018 в 14:23

Вам действительно нужно сделать это из папки 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
96
ответ дан Peter Mortensen 16 August 2018 в 11:13
поделиться
  • 1
  • 2
    В Ubuntu мне также пришлось указать путь. Не понимаю, почему он не может использовать текущий рабочий каталог по умолчанию. Я убежден, что Java спонсируется производителями клавиатуры! – gone 30 September 2014 в 15:21
  • 3
    Этот ответ дает массу предположений. И есть другие способы добиться этого. Вместо того, чтобы слепо следовать приведенному выше совету, я бы рекомендовал, чтобы люди нашли время, чтобы прочитать ссылки в моем ответе, которые объясняют, как работает класс Java. Лучше ПОНИМАТЬ, что вы делаете ... – Stephen C 6 March 2015 в 08:27
  • 4
    Вау! Это совершенно странная причина! (Но он служит вам для использования Notepad вместо реального текстового редактора :-)) – Stephen C 30 June 2015 в 09:18
  • 5
    – Stephen C 30 June 2015 в 09:24
  • 6
    Это не очень хорошая рекомендация. Вы зависите от переменной среды CLASSPATH, которая не установлена ​​или имеет значение, соответствующее «.». Да, он работает во многих случаях, но в других он не будет. – Stephen C 22 August 2015 в 06:20
  • 7
    Ну конечно javac -classpath . HelloWorld.java сработало бы! И это лучшее решение в вашем случае. – Stephen C 22 August 2015 в 10:15
  • 8
    Большое спасибо за это ... хотя и не уверен, почему Java не смог узнать путь к классам даже после установки в переменных среды. – akash89 1 September 2015 в 16:58
  • 9
    Этот совет может или не поможет. Это поможет, если дерево классов содержит классы в текущем каталоге. Это не так, если они не будут. На самом деле я бы этого не сделал. Вместо этого я бы создал сценарий оболочки с одним слоем, который работал независимо от того, находится ли пользователь в правом правиле. каталог. – Stephen C 8 November 2015 в 04:41
  • 10
    @ akash89 - Наиболее вероятными причинами были: 1) java не смотрел $ CLASSPATH (потому что вы использовали -classpath или -jar) или 2) параметр classpath не был установлен в среде, которая не была в эффект в контексте выполнения java; например потому что вы не "источник" файл, в который добавлены команды setenv в правой оболочке. – Stephen C 15 March 2016 в 14:14
  • 11
    Класс нельзя назвать «CommandLine.class». Это будет синтаксическая ошибка Java. (Вы имеете в виду, что файл, содержащий скомпилированный класс, называется «CommandLine.class» ...). Другая проблема заключается в том, что ваша команда на "cd в исходный каталог" работает только если вы скомпилировали код & gt; & gt; & gt; & lt; & lt; исходное дерево каталогов. Наконец, если ваш компилятор использовал & quot; -cp & quot; аргумент, тогда вам понадобится эквивалент при запуске. – Stephen C 25 July 2016 в 07:38
  • 12
    Я использую Debian 8, и это сработало. Не знаю, почему. – Frankline 23 August 2016 в 04:33
  • 13
    Да. Это наиболее вероятно, потому что ваш Main не находится в файле JAR. -cp lib.jar; означает то же, что и -cp lib.jar;., то есть текущий каталог включен в путь к классам. – Stephen C 22 September 2016 в 07:58
  • 14
    @StephenC и EduardoDennis. Было и то, что здесь тоже не хватало бана, что в банке был интерфейс, от которого зависел основной класс. Таким образом, сообщение об ошибке слишком велико. Я должен сказать, что «не смог найти». если файл класса не найден и «не может загрузить (отсутствующие зависимости)», если есть что-то еще, но не сам файл, поэтому сообщение об ошибке слишком велико, если вы фокусируетесь только на «найти», Часть этого :( – Aquarius Power 7 November 2016 в 22:00
  • 15
    @AquariusPower - Должна была быть дополнительная "вызвана" stacktrace для "причины" исключение, в котором отсутствует класс wht. Если вы хотите предложить разработчикам Java, что они изменяют сообщение об ошибке, которое говорит, что в течение 20 лет ... не стесняйтесь. (Я думаю, что сообщение об ошибке правильное. Проблема заключалась в том, что & gt; & gt; & gt; & lt; & lt; & lt; сузился в неправильном разделе.) – Stephen C 7 November 2016 в 23:42
  • 16
    @StephenC, что я имел в виду, они, безусловно, имеют доступ к информации, если файл основного класса доступен или нет, поэтому почему бы не показать нам лучшее сообщение об ошибке, в котором говорится, что такой файл отсутствует. С другой стороны, они также могли бы сказать «Файл найден, но не может быть загружен». в этот момент мы бы стремились сосредоточиться на зависимости вместо того, чтобы потерять полдня, исследуя и тестируя вещи, чтобы понять. Просто я имел в виду :). Они могут делать это ограниченным образом в течение 20 + лет, но они могут улучшить его, и мы здесь, чтобы предоставить, что произойдет через нашу критику и жалобы! : D – Aquarius Power 8 November 2016 в 02:57
  • 17
    Пожалуйста, поймите, что & gt; & gt; I & lt; имел ввиду. Жалуясь на это в некотором неясном комментарии к 3-летнему Q & amp; A, он ничего не добьется. Люди, которые могли бы согласиться на ваши жалобы, не заметят этого. Если вы хотите сделать что-то конструктивное, отправьте патч. (Я не оцениваю ваши шансы, но они будут больше, чем если бы вы просто болтали об этом.) – Stephen C 8 November 2016 в 03:19
  • 18
    Это работает только в простых случаях. Для более сложных случаев требуется более сложный путь к классам. – Stephen C 23 February 2017 в 12:46
  • 19
    И для & gt; & gt; действительно & lt; простые случаи, -cp . не требуется, потому что если $CLASSPATH не задано, то . - это путь по умолчанию. – Stephen C 7 March 2017 в 04:37
  • 20
    Нет, Стивен, много раз в Windows class classpath не работает. Я попробовал это на трех разных машинах, вы также можете попробовать это. – shaILU 5 May 2017 в 07:18
  • 21
    Вероятно, это потому, что вы фактически установили переменную среды% CLASSPATH%. Если вы это сделаете, то вы не используете путь по умолчанию. (Что делает выход echo %CLASSPATH%?) И нет, я не могу проверить, потому что у меня нет ПК с ОС Windows. – Stephen C 5 May 2017 в 07:24
  • 22
    Официальная запись Oracle для «java» (версия Windows) говорит следующее: & quot; Если -classpath и -cp не используются, а CLASSPATH не задано, то путь к пользовательскому классу состоит из текущего каталога (.). & quot; Ссылка - docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html – Stephen C 5 May 2017 в 07:27
  • 23
    В моем проекте у меня есть папка src и bin в корне. Я должен был cd в src, а затем запустить команду java ../bin com.blah.blah.MyClass, которая работала для меня. Так что спасибо за подсказку! – tamj0rd2 21 July 2017 в 12:28
  • 24
    Однако вы не получите вышеупомянутые сообщения об ошибках, если попытаетесь запустить приложение без надлежащего main из среды IDE. (И для некоторых IDE вам не нужно настроить панель запуска, чтобы это произошло, например, run Eclipse будет найти класс с методом main для вы. – Stephen C 22 August 2017 в 04:52
  • 25
    Фактически, если вы запустите приложение без этого параметра, вы получите точное сообщение в исходном вопросе: Could not find or load main class .... Вот как я приехал на этот пост :) – cepix 22 August 2017 в 17:41
  • 26
    Не в Eclipse вы не будете. В Eclipse, если среда IDE не может идентифицировать ни один из классов с main, вам просто не предлагается опция «Использовать и использовать Java» в контекстном меню. – Stephen C 22 August 2017 в 22:44
  • 27
    Это происходит потому, что вы выполняете скомпилированную версию вашего .java. Фактически выполняется файл .class – Jason V 20 September 2017 в 16:30
  • 28
    На Linux, как и на Mac. – Alex78191 4 October 2017 в 21:03
  • 29
    Почему /* необходим? – Alex78191 4 October 2017 в 21:03
  • 30
    Для записи это то же самое, что причина № 1, пример № 5 в моем ответе ... – Stephen C 30 October 2017 в 01:50
  • 31
    Это решило непосредственную проблему, поэтому я говорю, что это хорошо. – Chris Reid 2 February 2018 в 22:54
  • 32
    Если у вас есть пакет com.some.address в качестве первой строки, это не сработает. Вам нужно будет прокомментировать «адрес пакета». – Joe 12 March 2018 в 21:06
  • 33
    Спасибо, это было очень полезно. Несмотря на то, что я занимаюсь Java уже много лет, я не знал этого варианта. – Johannes Jander 6 April 2018 в 21:02
  • 34
    Это помогло мне и работало :) – Qadir Hussain 25 June 2018 в 07:09
Другие вопросы по тегам:

Похожие вопросы: