12

Runtime.exec() を使用して外部の .jar (IzPack インストーラーとしてビルド) を実行するコードがあります。

コマンドラインからこの external.jar を実行すると、次のようになります。

java -jar external.jar

その後、コマンド プロンプトは、アプリケーションが終了するまで制御を返しません。ただし、次を使用して、一部のJavaクラス内からexternal.jarを実行すると:

Process p = Runtime.getRuntime().exec("java -jar external.jar");
int exitCode = p.waitFor();
System.out.println("Process p returned: " + exitCode);

次に、external.jar がまだ実行を完了していないにもかかわらずp、成功コード でほぼ瞬時に戻ります(外部ファイル実行のルートを介してこれも試しました)。0ProcessBuilder

コマンドラインから戻るのを待つのに、別の Java プログラム内から実行するときは待たないのはなぜですか?

また、簡単なテストとして、A がC を呼び出す B を呼び出す A、B、および C の 3 つの jar をセットアップしました ( を使用Runtime.exec())。Thread.sleepそれは実行されます。

これはおそらく、あるものから別のものに実行が引き継がれる external.jar のスレッド化の問題の一種だと思いますが、コマンドラインから直接動作することを考えると、同じ動作が見られると予想していました (おそらく素朴に)別の Java プログラム内から呼び出された場合。

Java 6 を使用する Windows と Ubuntu でこれをテストしました。

ありがとう!

4

5 に答える 5

1

プロセスビルダーを使用できます....

ProcessBuilder pb = new ProcessBuilder("java", "-jar", "/fielname.jar");
Process p = pb.start();
p.waitFor();
于 2015-10-23T10:52:54.320 に答える
0

プロセスの生成を処理するために新しいスレッドを生成していますか? その場合、元のプログラムは生成されたプロセスとは独立して動作し続けるため、waitFor() は新しいプロセスでのみ機能し、親プロセスでは機能しません。

于 2012-07-05T19:06:07.447 に答える
-1

Process.waitFor()一部のネイティブ システム コマンドには役に立ちません。

プロセスの出力が返されるかどうかを判断するには、プロセスの出力を取得する必要があります。

私はあなたのためにサンプルコードを書きました

/**
 * 
 * @param cmdarray      command and parameter of System call
 * @param dir           the directory execute system call
 * @param returnImmediately   true indicate return after system call immediately; 
     *                          false otherwise.
 *  if set true, the returned call result does not have reference value
 * @return the return code of system call , default is -1
 */
public static int systemCall(String[] cmdarray,File dir,boolean returnImmediately)
{
  int result = -1;
  try {
   Process p = Runtime.getRuntime().exec(cmdarray,null,dir);
  if(!returnImmediately)
  {
   java.io.InputStream stdin = p.getInputStream();
   java.io.InputStreamReader isr = new java.io.InputStreamReader(stdin);
   java.io.BufferedReader br = new java.io.BufferedReader(isr);
   String line = null;
   while ( (line = br.readLine()) != null)
      System.out.println(line);
      }
      try{result =  p.exitValue();}
        catch(Exception ie){;}
      } catch (IOException e) {
        e.printStackTrace();}

  return result;
}

public static void main(String[] argc){             
  String[] cmdarray = {"jar","cvf","s2.jar","*"};
  File dir = new File("D:\\src\\struts-2.3.1");
  int k = systemCall(cmdarray,dir,true);
  System.out.println("k="+k);
 }
于 2012-09-07T06:19:51.743 に答える
-2

プロセスを使用してコンソールを使用していくつかのソフトウェアを実行するという同じ問題がありましたが、 process.waitFor() を使用して解決しました

私にとっては完璧に機能しました。

    try{
        Process tr = Runtime.getRuntime().exec( new String[]{ "wkhtmltopdf",frontPage,frontPagePDF});
        tr.waitFor();
    } catch (Exception ex) {
        EverLogger.logEntry("Error al pasar a PDF la portada", "error", "activity");
        return;
    } 
some more code here.
于 2013-12-10T10:31:33.850 に答える