Как выполнить java .class из командной строки

113

У меня есть скомпилированный класс java:

Echo.class

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

I cdв каталог и введите:java Echo "hello"

Я получаю такую ​​ошибку:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

Каков самый простой способ получить мой Java-код в форме, которую я могу запускать из командной строки, в отличие от использования Eclipse IDE?

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

Ответы:

119

Пытаться:

java -cp . Echo "hello"

Предполагая, что вы скомпилировали:

javac Echo.java 

Тогда есть шанс, что «текущий» каталог не находится в вашем пути к классам (где java ищет определения .class)

Если это так, и отображается список содержимого вашего каталога:

Echo.java
Echo.class

Тогда все это может сработать:

java -cp . Echo "hello"

или

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

А позже, как указывает Фредрик , вы получите еще одно сообщение об ошибке, например.

Исключение в потоке "main" java.lang.NoSuchMethodError: main

Когда это произойдет, прочтите его ответ :)

OscarRyz
источник
2
-Cp. чтобы сообщить Java, что он должен добавить. (текущий рабочий каталог) в путь к классам, то есть место, где он ищет код.
Фредрик,
16

Вам нужно указать путь к классам. Это должно сделать это:

java -cp . Echo "hello"

Это указывает java использовать .(текущий каталог) в качестве пути к классам, то есть места, где она ищет классы. Обратите внимание, что при использовании пакетов путь к классам должен содержать корневой каталог, а не подкаталоги пакета. например, если ваш класс есть, my.package.Echoа файл .class - bin/my/package/Echo.classэто правильный каталог пути к классам bin.

Майкл Боргвардт
источник
15

У вас нет действующего основного метода ... Подпись должна быть: public static void main ( String [] args);

Следовательно, в вашем случае код должен выглядеть так:

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

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

Фредрик
источник
15

С Java 11 вам больше не придется проходить через эту чушь!

Вместо этого вы можете сделать это:

> java MyApp.java

Вам не нужно компилировать заранее, так как все это делается за один шаг.

Вы можете получить Java 11 JDK здесь: JDK 11 GA Release

Райан Ланди
источник
> скопируйте C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Некоторые парни предпочитают старомодный путь =)
младший,
3

Если у вас есть в исходном коде Java

package mypackage;

и ваш класс hello.java с

public class hello {

и в этом hello.java у вас есть

 public static void main(String[] args) {

Затем (после компиляции) changeDir (cd) в каталог, где находится ваш hello.class. затем

java -cp . mypackage.hello

Обратите внимание на текущий каталог и имя пакета перед именем класса. Это работает для меня на Linux Mint, и я надеюсь, что и на других ОС

Спасибо Stack overflow за обилие информации.

Джерард Доутс
источник
1
NB: файл класса должен быть найден по ./mypackage/hello.classимени. См. Также: вопрос « Запуск java в пакете из командной строки ».
ruvim
2

Моя ситуация была немного сложной. Мне пришлось сделать три шага, так как я использовал .dll в каталоге ресурсов для кода JNI. Мои файлы были

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

Мой код содержал следующую строку

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

Сначала мне пришлось перейти в каталог пути к классам

cd /D "S:\Accessibility\tools\src\test\java"

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

set classpath=%classpath%;.;..\..\..\src\main\resources; 

Затем мне пришлось запустить java, используя имя класса.

java com.accessibility.HelloWorld 
Скотт Идзу
источник
0

Во-первых, скомпилировали ли вы класс с помощью компилятора javac командной строки? Во-вторых, похоже, что ваш основной метод имеет неправильную подпись - он должен принимать массив объектов String, а не только один:

public static void main(String[] args){

После того как вы изменили свой код, чтобы он принимал массив объектов String, вам нужно убедиться, что вы печатаете элемент массива, а не сам массив:

System.out.println(args[0])

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

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
quanticle
источник