2

Java アプリケーション内から Java CUP (LEX/YACC パーサーの Java バージョン) を実行しようとしています。

これは私が持っているコードです(ほとんどをインターネットからコピーしました):

String command  = "java " +
                  "-jar " +
                  "\"g:My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +
                  "-destdir " +
                  "\"g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\src\\Assembler\" " +
                  "\"G:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Assembler\\Assembler.cup\"";

Process p = Runtime.getRuntime().exec(command);
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=reader.readLine();
while(line!=null)
{
    System.out.println(line);
    line=reader.readLine();
}

Win 7 のコマンド プロンプトでこのコマンドを実行すると (バックスラッシュと二重引用符をエスケープせずに)、実行されます。「-jar」の後のすべてをコメントアウトすると、Java オプションが表示されるので (コマンドが不正であるため、これは当然のことです)、実行できることがわかります。

私の推測では、スペースを含むパスを渡すことが問題です。String[] を使用してみましたが、同じ結果が得られます。スペースをエスケープしてもエラーが発生します。

どうすればこれを解決できるか、誰にもわかりませんか?

ありがとう。

4

1 に答える 1

3

jarへのパスの最初のバックスラッシュが欠落しているようです。

String command  = "java " +
                  "-jar " +
                  "\"g:My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +

する必要があります

String command  = "java " +
                  "-jar " +
                  "\"g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +
                       ^^

編集:Runtime#exec(String) millimooseは、呼び出しにシェルを使用しないことを指摘したので、ドキュメントを確認しましたが、スペースStringTokenizerを分割するためにaを使用しているようです。Javaは、コマンド引数が二重引用符で囲まれている場合でも、コマンド引数を分割します。したがって、上記のバックスラッシュの問題を修正することに加えて、を受け入れるフォームを使用する必要があります。また、スペースを含む引数を二重引用符で囲む必要はありません。execString[]

String[] command = new String[] {
                       "java",
                       "-jar",
                       "g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar",
                       "-destdir",
                       "g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\src\\Assembler",
                       "G:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Assembler\\Assembler.cup",
                   };

Process p = Runtime.getRuntime().exec(command);
于 2013-01-25T17:21:51.647 に答える