2009-07-03 118 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类位于/家庭/地理/ 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 2009-07-03 19:39:03

+0

是的,它被编译。编译发生在运行操作之前。是不是-classpath“/ home/geo”将它加载到CLASSPATH中? – Geo 2009-07-03 19:45:25

+0

班上有包吗?如果是,则它是包必须位于CLASSPATH中的包的根目录。如果不是,请添加一个。没有包的类是微不足道的。 – duffymo 2009-07-03 19:54:20

回答

4

这是很很难说这是怎么回事,因为你没不会发布代码。

然而,这是我最受教育的猜测。

您试图将整个命令运行到java 字符串并且java解释器不会将它们识别为不同的参数。

尝试包装他们都在一个的String []

所以不是

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

与尝试:

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

或者,你可以发布您的实际代码,我们可以看看发生了什么。

编辑

这是我的尝试。我创建了RunIt.java类基本上是的Runtime.exec我建议和Hello.java其中相当多说你好+ ARGS [0]

这里的输出中:

$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 
$ 
1

不知道你的系统是什么,但是是的Runtime.exec不一样的外壳:尝试没有“次左右Ë类路径

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

(或使用与阵列参数的可执行程序)
,我以为你的类文件是/ home /地理/ GEOLINE。

编辑:如果您尝试使用标准输出重定向“DoSomething的> somefile”
运行时发生同样的情况。exec也不能识别这个

[]]

相关问题