2

2つの.javaファイルと1つの.batファイルを作成しました。最初の.javaファイルを「First.java」、2番目のファイルを「Second.java」と呼びましょう。バッチファイルは「compile.bat」です。First.javaが「.../Desktop / temp / First.java」にあり、Second.javaがバッチファイル(「..」とともに「... / Desktop / Test/Second.java」にあるとします。 ./Desktop/Test/compile.bat ")。現在、compile.batは次のコードで構成されています。

cmd /c "cd C:\blahblah\temp && javac First.java"

CMDとダブルクリックの両方でテストしましたが、機能します。次のコードを使用して、Second.javaからFirst.javaをコンパイルします。

Process p1 = Runtime.getRuntime().exec("C:\\blahblah\\compile.bat");

(CMDのデフォルトのdirはcompile.batのディレクトリと同じではないため、dirに移動する必要があります)。これは機能しません。単にコードを無視しているようです。私が言ったように、私は多くの異なることを試みました、私はディレクトリを変更するべきであった他のいくつかのライブラリを使用することさえ試みました。お願い助けて!

4

2 に答える 2

2

最も簡単な方法:を使用する必要がありますstart。作業ディレクトリの設定も可能です。次の例を見てください。

Runtime r=Runtime.getRuntime();
    r.exec("cmd.exe /c start compile.bat",         //path to executable
            null,                                  // env vars, null means pass parent env
            new File("C:\\blahblah"));              // working directory 

追加情報:別のコンソールでプロセスを開始したくない場合は(それが実行startできます)、実行できますがr.exec("cmd.exe /c compile.bat");、親コンソールのコンテキストで実行されるため、入力ストリームを待つか読み取る必要p.waitFor()があります。そうしないと、サイレントに実行される可能性があります。不合格。これが実行され、コマンドからの出力が表示されます。

Process p=r.exec("cmd.exe /c compile.bat",         //path to executable
            null,                                  // env vars, null means pass parent env
            new File("C:\\blahblah"));

    InputStream is=p.getInputStream();
    BufferedReader br= new BufferedReader(new InputStreamReader(is));

    String line=new String();
    while ((line=br.readLine())!=null) System.out.println (line);

また、1.5以降、ProcessBuilderは(Java docから)プロセスを開始するための推奨される方法です。

java.lang.Process

プロセスを作成するメソッドは、ネイティブウィンドウプロセス、デーモンプロセス、MicrosoftWindowsのWin16/ DOSプロセス、シェルスクリプトなど、特定のネイティブプラットフォームの特別なプロセスではうまく機能しない場合があります。

デフォルトでは、作成されたサブプロセスには独自のターミナルまたはコンソールがありません。そのすべての標準I/O(つまり、stdin、stdout、stderr)操作は親プロセスにリダイレクトされ、getOutputStream()、getInputStream()、およびgetErrorStream()メソッドを使用して取得されたストリームを介してアクセスできます。親プロセスは、これらのストリームを使用して、サブプロセスに入力を供給し、サブプロセスから出力を取得します。一部のネイティブプラットフォームでは、標準の入力ストリームと出力ストリームに限られたバッファサイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りに失敗すると、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

必要に応じて、ProcessBuilderクラスのメソッドを使用してサブプロセスI/Oをリダイレクトすることもできます。

Processオブジェクトへの参照がなくなると、サブプロセスは強制終了されませんが、サブプロセスは非同期で実行を継続します。

Processオブジェクトによって表されるプロセスが、Processオブジェクトを所有するJavaプロセスに対して非同期または同時に実行される必要はありません。

1.5以降、ProcessBuilder.start()がプロセスを作成するための推奨される方法です。

以来:JDK1.0

于 2012-08-14T12:39:40.743 に答える
1

これがJavaからの直接引用である場合は、最後にセミコロン、文字列に必要なエスケープ文字、およびcmd.exeを起動する必要があることをWindowsに示すためのcmdコマンドがありません。

Process p1 = Runtime.getRuntime().exec("cmd C:\\blahblah\\compile.bat");

cmdの後に/cを追加して、プロセスが完了したらすぐに閉じたり、別のウィンドウで起動する必要があることを示したりすることもできます。

于 2012-08-14T12:03:23.373 に答える