大家好,不知道为什么这段代码可以在Windows上运行,但不能在Linux上运行,所以如果有人发现这个或其他方式有问题,我会非常感谢您的一些指导,感谢您的时间。
Process p = Runtime.getRuntime().exec(linuxCommand);
int cont=0,retorno=p.waitFor();
try {
synchronized (this) {
while (retorno!=0 && conteo<10000){
retorno=p.waitFor();
System.out.println("cont++);
}
if (retorno == 0) {
ans = true;
logger.info("Return Value: " + ans);
}else{
ans = false;
logger.info("Return Value: " + ans);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
目标:根据* 1_Input.txt *中包含的信息创建* 1_Output.txt *,
MyObjectT 驻留在/ var / xp / client / a / h / n / test
MyObjectT 将调用/ var / xp / client / a / h / n / clases / z1中的几个类,并最终 READ 1_Output.txt的内容,以便它可以返回的 ANS (真/假)
问题
linuxCommand 是一个解析后的String,表示要在linux中执行的java命令
请注意,如果我将此命令粘贴到命令shell中,它将运行正常,没有警告或错误。我认为&#34; 在这里发挥着重要作用。 linuxCommand-&GT; /opt/jdk/jdk1.6.0_22/bin/java -classpath&#34; / var / xp / client / a / h / n / clases / z1&#34;:&#34; / var / xp /客户端/ A / H / N /测试&#34; MyObjectT / m:Param21 /f:" ;/var/xp/client/a/h/n/IOFile/1_Input.txt" / o:&#34; /var/xp/client/a/h/n/IOFile/1_Output.txt"
所以令我困惑的是,如果使用getErrorStream()来追踪一些错误,我会得到这个
Exception in thread "main" java.lang.NoClassDefFoundError: MyObjectT
Caused by: java.lang.ClassNotFoundException: MyObjectT
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: MyObjectT. Program will exit.
任何帮助,非常感谢再次感谢
大声笑我很抱歉西班牙语retorno = return中的变量名称,但在我翻译时我没有停下来想想返回 ajajjaajajajaj:=)
答案 0 :(得分:1)
同时有一些事情在起作用。首先,你已经运行了多个程序 - 这个程序和你正在生成的程序 - 以及中程序中的错误在这里引起了麻烦。
首先,linuxCommand
:
/opt/jdk/jdk1.6.0_22/bin/java -classpath
"/var/xp/client/a/h/n/clases/z1":"/var/xp/client/a/h/n/test"
MyObjectT /m:Param21 /f:"/var/xp/client/a/h/n/IOFile/1_Input.txt"
/o:"/var/xp/client/a/h/n/IOFile/1_Output.txt"
我任意包裹它。根据您在程序中定义此字符串的方式,您可能需要转义此字符串中的所有"
标记。 (如果您只是使用System.out.println()
打印它,它看起来像什么?)
可能更好的方法是使用slightly different form of exec()
,一个采用字符串数组而不是单个字符串的方法。这样,您可以按照程序需要来中断参数,而无需担心正确的shell引用。它看起来像这样(未经测试的)块:
String linuxCommand[] = {"/opt/jdk/jdk1.6.0_22/bin/java",
"-classpath",
"/var/xp/client/a/h/n/clases/z1:/var/xp/client/a/h/n/test",
"MyObjectT",
"/m:Param21",
"/f:/var/xp/client/a/h/n/IOFile/1_Input.txt",
"/o:/var/xp/client/a/h/n/IOFile/1_Output.txt"};
Process p = Runtime.getRuntime().exec(linuxCommand);
您确实说过在shell中手动运行此命令以确认其有效,但那些/i
,/o
等感觉非常尴尬类似Unix的平台。您是否自信该格式在Linux上按预期工作?