Як виконати java .class з командного рядка


113

У мене складений клас java:

Ехо.клас

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

            System.out.println(arg);
    }
}

Я 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-код у формі, яку я можу запустити з командного рядка, як призначений для використання ID Eclipse IDE?


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

Відповіді:


119

Спробуйте:

java -cp . Echo "hello"

Припустимо, що ви склали:

javac Echo.java 

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

Якщо це так, і перелік вмісту вашого dir відображає:

Echo.java
Echo.class

Тоді будь-що з цього може працювати:

java -cp . Echo "hello"

або

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

І пізніше, як зазначає Фредрік , ви отримаєте ще одне повідомлення про помилку.

Виняток у потоці "main" java.lang.NoSuchMethodError: main

Коли це станеться, ідіть і прочитайте його відповідь :)


2
-Cp. сказати Яві, що він повинен додати. (поточний робочий каталог) до classpath, тобто місце, де він шукає код.
Фредрік

16

Потрібно вказати шлях класу. Це слід зробити:

java -cp . Echo "hello"

Це вказує Java використовувати .(поточний каталог) як свій класний шлях, тобто місце, де він шукає заняття. Зверніть увагу, ніж при використанні пакетів, classpath повинен містити кореневий каталог, а не підкаталоги пакунків. Наприклад, якщо ваш клас є, my.package.Echoа файл .class - bin/my/package/Echo.classправильний каталог classpath 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 && дель MyApp.class && дель MyApp.java Деякі хлопці вважають за краще старий шлях моди =)
молодший

3

Якщо у вас є джерело Java

package mypackage;

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

public class hello {

і в цьому hello.java у вас є

 public static void main(String[] args) {

Потім (після компіляції) змінітьDir (cd) в каталог, де знаходиться ваш hello.class. Тоді

java -cp . mypackage.hello

Зверніть увагу на поточний каталог та назву пакета перед назвою класу. Він працює на моєму Linux-монетному дворі, і я сподіваюся, що і інші ОС

Завдяки переповненню стека за велику кількість інформації.


1
Примітка: файл класу слід шукати через ./mypackage/hello.classім'я. Дивіться також: Питання " Запуск Java в пакеті з командного рядка ".
рувим

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());

По-перше, мені довелося перейти до каталогу classpath

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

Далі, мені довелося змінити classpath, щоб вказати на поточний каталог, щоб мій клас був завантажений, і я повинен був змінити classpath, щоб вказати на каталог ресурсів, щоб мій 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.