-1

こんにちは、誰もがこのコードが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のいくつかのクラスを呼び出し、最終的に1_Output.txtのコンテンツを読み取ります。ans(true / false)を返すことができます

問題

  • Windowsの場合:高速化するときのフローは、1_Output.txtファイルが作成されるのを待たなかったため、現在のコードが解決された状態で、読み取るものがありませんでした。(p.waitFor()は最終的に0を返し、誰もが満足しています)
  • Linux:p.waitFor()が0を返すことはなく、フローは終了し、何も返されません

linuxCommandは、Linuxで実行されるJavaコマンドを表す解析された文字列です。

このコマンドをコマンドシェルにそのまま貼り付けると、警告やエラーなしで正常に実行されることに注意してください。ここで重要な役割を果たす とは思いません 。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.

助けてくれて、ありがとうございました

笑スペイン語のretorno=returnの変数名については申し訳ありませんが、翻訳した時点で私は立ち止まらず、return ajajjaajajajaj:=)について考えました。

4

1 に答える 1

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()と、どのようになりますか?)

おそらくより良いアプローチは、単一の文字列の代わりに文字列の配列をとる、わずかに異なる形式のを使用することです。exec()このようにして、適切なシェル引用符を気にすることなく、プログラムが必要とするパラメータを壊すことができます。これは、次のような(テストされていない)チャンクのようになります。

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);

このコマンドをシェルで手動で実行して機能することを確認したとおっしゃっていましたが、Unixライクなプラットフォームでは、これらのコマンドなどは非常に扱いにくいと/i感じ/oいます。Linuxでフォーマットが期待どおりに機能することを確信していますか

于 2012-06-22T22:19:31.193 に答える