0

ProcessBuilderを使用してJavaからjavacを実行しようとしていますが、出力が得られず、何も起こりません。入力ストリームを読み取ろうとしましたが(読み取らないとプロセスがハングするバグがあるため)、それでも結果が得られません。最初は必要なすべてのパラメーターをjavacに渡しましたが、機能していなかったため、javac(ヘルプメッセージを出力する必要があります)だけに簡略化しました。

"C:\ Windows \ System32 \ cmd.exe / c C:\\" Program Files \ "\ Java \ jdk1.6.0_23 \ bin \ javac.exe" "C:\\" Program Files \"\を実行してみましたJava \ jdk1.6.0_23 \ bin \ javac.exe "であり、javacへのパス全体を二重引用符で囲んでいますが、それでも何もありません。

エラーが発生します

プログラム"C:\ Windows \ System32 \ cmd.exe / c C:\" Program Files "\ Java \ jdk1.6.0_23 \ bin \ javac.exe"を実行できません:CreateProcess error = 2、システムは指定されたファイルを見つけることができません

しかし、コマンドをコピーしてコマンドラインから実行すると、正常に機能します。

JavaCompilerクラスを使用してファイルをコンパイルすることは知っていますが、Javaからdosアプリケーションまたは.batファイルを実行できないため、最初にこの問題を修正したいと思います。notepad.exeのようなGUIプログラムは問題なく実行できます。

String[]  commands = new String[]{
             "C:\\Windows\\System32\\cmd.exe  /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
          };

  logger.log(Level.INFO, "About to run javac with the command below:");
  String commandToOutput = "";
  for (String command : commands) {
     commandToOutput += command + " ";
  }
  logger.log(Level.INFO, commandToOutput);



  ProcessBuilder processBuilder = new ProcessBuilder(commands);
  Process p = processBuilder.start();

編集2

String[] commands = new String[]{
         "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "-d", "\"" + tempDir + "\"", "-classpath", classpath
      };

編集3

2番目のコマンド配列は機能するのに最初のコマンド配列は機能しないのはなぜですか。

//this gives me CreateProcess error=5, Access is denied
      commands = new String[]{
                 "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
              };

//this works
      commands = new String[]{
                 "C:\\Windows\\System32\\cmd.exe",
                 "/c",
                 "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe",
              };
4

3 に答える 3

2

ProcessBuilder に渡す文字列配列には、1 つの大きな文字列にすべてを含めるのではなく、配列要素ごとに 1 つの引数を含める必要があります。

これを試して:

文字列[] コマンド = 新しい文字列[]
{
  "C:\\Windows\\System32\\cmd.exe",
  "/c",
  "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
};

ところで: cmd.exe を呼び出す必要はありません。javac.exe を ProcessBuilder に直接渡すことができます。

ProcessBuilder ビルダー = new ProcessBuilder(
   "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "\\Path\\To\\MyClass.java"
);
于 2011-02-13T15:44:00.427 に答える
1

あなたは自分から読む必要がありprocess.getInputStream()ます。私の知る限り、プロセスの出力は stdout に自動的に表示されません。

于 2011-02-13T18:09:44.670 に答える
0

プロセスビルダーの間違った方法を使用しています。単一の文字列バージョンを使用します。つまり、文字列配列を渡さずに、文字列を渡すだけです。文字列配列バージョンは、コマンドをプログラム、そのオプション、およびその引数にすでに分割している場合に使用します。現在のところ、。と呼ばれるプログラム実行可能ファイルを探していますC:\\Windows\\System32\\cmd.exe /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe

または、コマンドを文字列配列のプログラムと引数に分割してから、文字列配列バージョンのプロセスビルダーを使用できます。

String[] = new String[] {
    "C:\\Windows\\System32\\cmd.exe",
    "/c",
    "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
}

于 2011-02-13T15:41:10.227 に答える