我正在从我的一个类执行java二进制文件,并抛出一个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类位于/home/geo/Geoline.java。问题是,无论我在哪个文件系统中,如果我手动执行相同的命令,就会执行该类。当使用 Runtime.getRuntime()。exec 执行二进制文件时,为什么不会发生同样的事情?
编辑:这是使用详细标记生成的输出:pastie link 编辑:这是文件的内容:
public class Geoline {
public static void main(String[] args) {
System.out.println("blabla");
}
}
答案 0 :(得分: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"
});
或者,您可以发布您的实际代码,我们可以看到正在发生的事情。
编辑
这是我的尝试。我创建了 RunIt.java 类,它基本上是我建议的 Runtime.exec 和 Hello.java ,它几乎说 Hello + 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 :(得分:1)
您可能需要阅读:When Runtime.exec() won't
答案 2 :(得分:1)
不确定您的系统是什么,但Runtime.exec与shell不同:尝试没有“围绕类路径
/usr/bin/java -classpath /home/geo Geoline
(或者使用带有数组参数的exec)
我假设你的班级文件是/home/geo/Geoline.class
编辑:如果您尝试使用标准输出重定向“dosomething> somefile”,则会发生相同的情况 Runtime.exec也无法识别这个
[]]