2009-07-03 5 views
0

내가 내 클래스 중 하나에서 자바 바이너리를 실행하고 있습니다 던져 도착하고, 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 클래스에 위치/홈/지역/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에 -classpath "/ home/geo"가로드되지 않습니까? – Geo

+0

클래스에 패키지가 있습니까? 그렇다면 패키지의 루트가 CLASSPATH에 있어야하는 디렉토리입니다. 아니요 인 경우 하나 추가하십시오. 패키지가없는 클래스는 간단합니다. – duffymo

답변

4

당신이 didn를하기 때문에 무슨 일이 일어나고 있는지 이야기하는 것은 매우 어렵다 코드를 게시하지 마십시오.

그러나 이것은 내가 가장 교육받은 추측입니다.

전체 명령을 Java 문자열으로 실행하려고하는데 Java 인터프리터가이를 다른 인수로 인식하지 못합니다.

문자열 []

에 그들 모두를 포장하려고 그래서 그 대신

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

의와 시도 :

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

또는, 당신은 당신의 실제 코드를 게시 할 수 있으며, 우리는 할 수 무슨 일이 일어나는지 보아라.

편집

이 내 시도이다.

$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 
$ 
: 제가 제안과 거의 말한다 Hello.java안녕하세요 +의 인수 [0] 여기

가 OUPUT의로 기본적으로 Runtime.exec의RunIt.java 클래스를 생성

+0

이것이 효과적입니다! 오스카 감사합니다! 감사합니다 duffymo 너무! – 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의 쉘과 동일하지 않습니다 :은 "주변에 일하지 않고 시도 E 클래스 경로

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

(배열 인수와 함께 간부를 사용하거나)
와 나는 당신의 클래스 파일는/home/지역/Geoline을 가정합니다. 클래스

편집 : 당신이 "해봐요> somefile"
런타임을 표준 출력 리디렉션을 사용하려고하면 같은 문제가 발생합니다.임원도 이것을 인식하지 못합니다.

[]]