程序使用waitFor()不能在Linux上工作,因为它在Windows上

时间:2012-06-22 01:55:42

标签: java linux thread-safety synchronized

大家好,不知道为什么这段代码可以在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 (真/假)

问题

    Windows上的
  • :加速时的流程并没有等待创建1_Output.txt文件,所以没有什么可读的,当前的代码已经解决了。 (p.waitFor()最终返回0并且每个人都很高兴)
  • Linux:p.waitFor()永远不会返回0流程结束而没有

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:=)

1 个答案:

答案 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上按预期工作?