【发布时间】:2012-06-22 01:55:42
【问题描述】:
大家好,大家不知道为什么这段代码可以在 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(true/false)
问题
- 在 Windows 上:快速的流程没有等待创建 1_Output.txt 文件,因此没有什么可读取的,当前代码已解决。 (p.waitFor() 最终返回 0,大家都很开心)
- Linux : p.waitFor() 永远不会返回 0 流程结束并且什么都没有
linuxCommand是一个解析后的String,表示要在linux中执行的java命令
请注意,如果我将这个命令按原样粘贴在命令 shell 中,它将运行正常,没有警告或错误。我不认为 " 在这里起重要作用。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"
所以让我感到困惑的是,如果使用 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.
任何帮助,非常感谢再次感谢
lol 我很抱歉西班牙语 retorno=return 中的变量名,但在我翻译的时候,我并没有停下来思考 return ajajjaajajajaj :=)
【问题讨论】:
-
您的源代码有问题。你写了
return=p.waitFor(); -
这可能是相关的:velocityreviews.com/forums/…
-
您的错误与您的类路径有关。 MyObjectT 位于哪里,它的包层次结构是什么?
-
感谢您抽出宝贵时间,是的,我知道 "return" 但我最初是用西班牙语 retorno 写的,经过一天忙碌的工作... @DJ 感谢您的考虑,实际上我将 linuxCommand 变量替换为“updatedb”并且它起作用了。该进程等待了至少 15 秒,然后返回 ans=0 所以是的,它与类路径有关,但另一个有趣的事情是,如果您将解析设置部分更改为 windows,因此类路径分隔符保持 : 就像在 Linux 中一样,它会像上面的例子一样发出相同的 stackTrace 错误
-
@sarnold 我修复了变量名以反映原始代码 DJ 谈论的关于类路径问题的任何提示
标签: java linux thread-safety synchronized