2009-07-03 5 views
0

Я выполнения Java бинарного от одного из моих классов, и ClassNotFoundException брошено:Я не понимаю, почему это ClassNotFoundException выкинут


Results of executing:/usr/bin/java -classpath "/home/geo" Geoline 
Error stream: 
Exception in thread "main" java.lang.NoClassDefFoundError: Geoline 
Caused by: java.lang.ClassNotFoundException: Geoline 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:323) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:268) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) 
Could not find the main class: Geoline. Program will exit. 
Output stream: 

Класс геоЛайн расположен в/дома/гео/Geoline.java. Дело в том, что независимо от того, где в файловой системе я нахожусь, если я выполняю ту же самую команду вручную, класс выполняется. Почему не происходит то же самое, когда двоичный файл выполняется с помощью Runtime.getRuntime(). Exec?

редактировать: вот вывод, сгенерированный с многословной флагом на: pastie link редактировать: вот содержимое файла:


public class Geoline { 
    public static void main(String[] args) { 
     System.out.println("blabla"); 
    } 
} 
+0

Почему вы цитируете файл .java? Мне не нравится спрашивать «глупый» вопрос, но вы скомпилировали его в файл .class? И является ли каталог, в которой путь /home/geo/Geoline.class живет в CLASSPATH? – duffymo

+0

Да, он скомпилирован. Компиляция происходит до запуска. Разве не -classpath «/ home/geo» загружает его в CLASSPATH? – Geo

+0

Имеет ли класс пакет? Если да, это каталог, в котором находится корень пакета, который должен находиться в CLASSPATH. Если нет, добавьте его. Классы без пакетов тривиальны. – duffymo

ответ

4

Это довольно трудно сказать, что это происходит потому, что вы Бесполезный Не вводите код.

Однако это моя самая образованная догадка.

Вы пытаетесь запустить всю команду в java String, и интерпретатор java не распознает их как разные аргументы.

Попробуйте упаковывать их все в String []

Таким образом, вместо

Runtime.getRuntime().execute("/usr/bin/java -classpath \"/home/geo\" Geoline"); 

Попробуйте с:

Runtime.getRuntime().execute(new String[]{ 
       "/usr/bin/java","-classpath","/home/geo","Geoline" 
}); 

Или, вы можете разместить свой реальный код и мы можем посмотри, что происходит.

EDIT

Это моя попытка. Я создаю RunIt.java класс, который является в основном Runtime.exec как я предложил и Hello.java, которые в значительной степени говорит Hello + арг [0]

Вот Ouput:

$cat RunIt.java 
import java.io.*; 

public class RunIt{ 
    public static void main(String [] args) throws IOException { 
     Process p = Runtime.getRuntime().exec( args); 
     BufferedReader reader = new BufferedReader(new InputStreamReader (p.getInputStream())); 
     String line = null; 

     while((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 
     reader.close(); 
    } 
} 
$cat Hello.java 
public class Hello { 
    public static void main(String [] args) { 
     System.out.println("Hola: " + (args.length > 0 ? args[0] : " a nadie")); 
    } 
} 
$javac RunIt.java 
$java RunIt javac Hello.java 
$java RunIt java Hello Mundo 
Hola: Mundo 
$ 
+0

Это сработало! Спасибо, Оскар! Спасибо, даффимо! – Geo

1

Вам может понадобиться прочитать: When Runtime.exec() won't

+0

Что с этой статьей? Мне никогда не хотелось читать, но это датировано 2000 годом. Возможно, все было исправлено. В Java1.5 новый класс был добавлен в JRE: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html Я не знаю, было ли это исправление что говорится в этой статье. У вас есть сводка? – OscarRyz

+0

Сообщает вам об ошибках при использовании Runtime.exec(). Vintage 2000, но все же стоит знать, потому что Runtime не изменилось с тех пор. – duffymo

1

не уверен, что ваша система, но Runtime.exec не то же самое в качестве оболочки: попробуйте без "вокруг я е классам

/usr/bin/java -classpath /home/geo Geoline 

(или использовать ехес с аргументом массива)
, и я полагаю, ваш файл класса является/дом/GEO/геоЛайн. класс

EDIT: То же самое происходит, если вы пытаетесь использовать стандартное перенаправление вывода «DoSomething>»
некий-файл времени выполнения.exec не признает это слишком

[]]

Смежные вопросы