2009-08-14 2 views
70

У меня есть скомпилированный класс Java:Как выполнить Java .class из командной строки

Echo.class

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-код в форме, которую я могу запустить из командной строки, поскольку это связано с необходимостью использования Eclipse IDE?

+11

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

ответ

83

Try:

java -cp . Echo "hello" 

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

javac Echo.java 

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

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

Echo.java 
Echo.class 

Затем все это может работать:

java -cp . Echo "hello" 

или

SET CLASSPATH=%CLASSPATH;. 

java Echo "hello" 

И позже Fredrik указывает, вы получите еще одно сообщение об ошибке, как.

Exception in thread "main" java.lang.NoSuchMethodError: main

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

+0

+1 как и было обещано. – Fredrik

+0

что, похоже, работает, но почему: java -cp. – joe

+2

-cp. чтобы сказать Java, что он должен добавить. (текущий рабочий каталог) в classpath, что означает место, где он ищет код. – Fredrik

11

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

java -cp . Echo "hello" 

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

11

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

Таким образом, в вашем случае код должен выглядеть следующим образом:

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

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

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

+0

+1 для чтения кода – Allyn

+0

@Allyn: Я бы -1 за то, что не читал исключение, хотя: :) :) :) Но мы среди друга здесь, Мы? – OscarRyz

+0

@ Оскар: Я дал вам кредиты за это, не я :-) (на самом деле, я дам вам +1 за него) – Fredrik

0

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

public static void main(String[] args){ 

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

System.out.println(args[0]) 

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

for(int i = 0; i < args.length; i++){ 
    System.out.print(args[i]); 
} 
System.out.println(); 
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 
Смежные вопросы