外部プログラムはRuntimeで実行する


Javaのプログラム内から他のプログラムを実行させたいようなときもあります。もちろん、Javaはプラットフォームに依存しないのが特徴ですから、こうした「外部プログラムの実行」を行うと、特定のプラットフォームに依存する作りになってしまいます。が、そうした問題があったとしても行いたいときはあるはずですね。

こういうときに用いられるのが「java.lang.Runtime」というクラスです。これはJavaアプリケーションとその実行環境との間の橋渡しをする役目を持ちます。Javaアプリケーションは、すべてただ1つのRuntimeインスタンスをもっており、これを介してJava仮想マシン外の(Javaアプリケーションが動いている)実行環境にアクセスできます。

JavaアプリケーションがもっているRuntimeインスタンスは「Runtime.getRuntime」メソッドで得ることができます。こうして取得したRuntimeインスタンスの「exec」メソッドを実行することで、外部のプログラムを実行できるのです。

import java.io.IOException;

public class Sample {

  public static void main(String[] args) {
    try {
      Runtime rt = Runtime.getRuntime();
      rt.exec("notepad.exe");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
  
}


例えば、これはWindowsでnotepad.exeを実行するサンプルです。EXEファイルへのパスが通っていれば、このように簡単にプログラムを起動できます。またパスが通っていない場合でも、そのファイルをフルパスで指定することで実行は可能です。このexecは、プログラムファイルが存在しなかった場合にはIOExeptionを発生させるため、try内で実行する必要があります。

では、これを応用して「Javaプログラム内から別のJavaプログラムを実行する」ということもできるでしょうか。これは、例えばこんな具合にすればよいでしょう。

public static void main(String[] args) {
  try {
    Runtime rt = Runtime.getRuntime();
      rt.exec("java -jar ""C:\allabout\FreeLife.jar""");
  } catch (IOException ex) {
    ex.printStackTrace();
  }
}


これは、Cドライブにある「allabout」フォルダの中の「FreeLife.jar」を実行するサンプルです。Javaのプログラムは、javaコマンドで実行しますね。JARの場合は、「java -jar hoge.jar」というようにして実行することが可能です。

注意すべきは、ファイルの指定です。ファイルのパスをC:allaboutFreeLife.jarと指定して「動かない」という凡ミスはよくやってしまうものです。え、「何が悪いんだ?」って? Stringリテラル内で記号を使うときにはエスケープして\と書かなければいけなかったでしょう?