【Java】Java から別のJava(JARファイル)を実行するには...

■ 『Java から別のJARファイルを実行する』を実現するために...

Java から別のJARファイルを実行するには...

ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", "[JARファイル名].jar");
// コマンドライン引数を使う場合...
// ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", "[JARファイル名].jar", "引数1", "...");

Process process = processBuilder.start();

int resultCode = process.waitFor();

Process.waitFor() の戻り値「サブプロセスの終了コード」を設定するには...

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Process.html#waitFor--
// 別プロセスとして実行したいJavaで、最後に以下のメソッドを呼び出す
System.exit([終了コード]);

使用上の注意:Linux上での実行

 * Linux(Debian8/Java1.8.0_65)上では、System.exitに設定する値は
  『0~255』の範囲で行う必要がある
 * 詳細は以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37217908.html

■ サンプル

OtherJava.java

別プロセスとして実行したいJava。 OtherJava.jar にする
public class OtherJava {
  public static void main(String[] args) throws Exception {
    if (args == null || args.length < 1) {
      throw new IllegalArgumentException("Illegal Arguments");
    }
    
    String input = args[0];
    if (input.equals("error")) {
      System.err.println("error...");
      throw new Exception("error");
    } else if (input.equals("return_code_10")) {
      System.out.println("Return Code 10...");
      System.exit(10);
    }
    
    System.out.println("Hello World, " + input);
  }
}

Main.java

呼び出し側
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws InterruptedException {
    System.out.println("Test0");
    execute("java", "-jar", "OtherJava.jar");
    Thread.sleep(1000L);
    System.out.println();

    System.out.println("Test1");
    execute("java", "-jar", "OtherJava.jar", "error");
    Thread.sleep(1000L);
    System.out.println();
    
    System.out.println("Test2");
    execute("java", "-jar", "OtherJava.jar", "return_code_10");
    Thread.sleep(1000L);
    System.out.println();
    
    System.out.println("Test3");
    execute("java", "-jar", "OtherJava.jar", "Mike");
    Thread.sleep(1000L);
    System.out.println();
    
    System.out.println("Done");
  }

  private static void execute(String... commands) {
    try {
      ProcessBuilder processBuilder = new ProcessBuilder(commands);
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);

      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
      }
      try (BufferedReader errorBufferedreader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        String errorLine;
        while ((errorLine = errorBufferedreader.readLine()) != null) {
          System.err.println(errorLine);
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Test0
Result Code : 1
Exception in thread "main" java.lang.IllegalArgumentException: Illegal Arguments
	at com.sample.proc.OtherJava.main(OtherJava.java:6)

Test1
Result Code : 1
error...
Exception in thread "main" java.lang.Exception: error
	at com.sample.proc.OtherJava.main(OtherJava.java:12)

Test2
Result Code : 10
Return Code 10...

Test3
Result Code : 0
Hello World, Mike

Done


関連記事

Java】プロセス情報(PIDなど) に関するあれこれ

https://blogs.yahoo.co.jp/dk521123/37013520.html

Java】 外部プログラム/コマンドを実行するには ~ ProcessBuilder ~

https://blogs.yahoo.co.jp/dk521123/34842155.html

Java】プロキシ設定のチェック機能を考える

https://blogs.yahoo.co.jp/dk521123/37181766.html

【トラブル】【JavaLinux 上で、System.exit() に設定した値が process.waitFor() で受け取った時に値が異なる

https://blogs.yahoo.co.jp/dk521123/37217908.html