他のJavaプログラムからJavaプログラムをコンパイルして実行する方法
別のJavaプログラムからJavaプログラムをコンパイルして実行することが可能か考えたことはありますか?Runtime.exec(String cmd)を使用して、基礎となるオペレーティングシステムにコマンドを発行することができます。同じアプローチを使用して、別のJavaプログラムからJavaプログラムをコンパイルして実行します。
別のJavaプログラムからJavaプログラムをコンパイルして実行する。
別のJavaプログラムからコンパイルおよび実行される簡単なJavaプログラムを作成しましょう。
package com.scdev.files;
public class Test {
public static void main(String[] args) {
System.out.println("Start");
for(String str : args){
System.out.println(str);
}
}
}
こちらは、Testクラスをコンパイルして実行している別のプログラムです。
package com.scdev.files;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CompileRunJavaProgram {
public static void main(String[] args) {
try {
runProcess("pwd");
System.out.println("**********");
runProcess("javac -cp src src/com/scdev/files/Test.java");
System.out.println("**********");
runProcess("java -cp src com/scdev/files/Test Hi Pankaj");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void printLines(String cmd, InputStream ins) throws Exception {
String line = null;
BufferedReader in = new BufferedReader(
new InputStreamReader(ins));
while ((line = in.readLine()) != null) {
System.out.println(cmd + " " + line);
}
}
private static void runProcess(String command) throws Exception {
Process pro = Runtime.getRuntime().exec(command);
printLines(command + " stdout:", pro.getInputStream());
printLines(command + " stderr:", pro.getErrorStream());
pro.waitFor();
System.out.println(command + " exitValue() " + pro.exitValue());
}
}
javacコマンドとjavaコマンドの違いに注意してください。これは、Eclipseの作業ディレクトリがプロジェクトのルートディレクトリである一方、クラスのソースディレクトリはsrcですから、このようにする必要があります。Eclipseから上記のプログラムを実行すると、以下の出力が生成されます。
pwd stdout: /Users/scdev/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
Path Serapartor = /
javac -cp src src/com/scdev/files/Test.java exitValue() 0
**********
java -cp src com/scdev/files/Test Hi Pankaj stdout: Start
java -cp src com/scdev/files/Test Hi Pankaj stdout: Hi
java -cp src com/scdev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/scdev/files/Test Hi Pankaj exitValue() 0
scdev:~ scdev$ cd /Users/scdev/Documents/eclipse-workspace/JavaExceptions
scdev:JavaExceptions scdev$ javac -cp src src/com/scdev/files/Test.java
scdev:JavaExceptions scdev$ javac -cp src src/com/scdev/files/CompileRunJavaProgram.java
scdev:JavaExceptions scdev$ java -cp src com/scdev/files/CompileRunJavaProgram
pwd stdout: /Users/scdev/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
javac -cp src src/com/scdev/files/Test.java exitValue() 0
**********
java -cp src com/scdev/files/Test Hi Pankaj stdout: Start
java -cp src com/scdev/files/Test Hi Pankaj stdout: Hi
java -cp src com/scdev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/scdev/files/Test Hi Pankaj exitValue() 0
scdev:JavaExceptions scdev$
public static void main(String[] args) {
try {
if(args.length < 2) throw new Exception("Mandatory Arguments missing");
runProcess(args[0]);
runProcess(args[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
私たちは、プラットフォームに依存しないようにコマンドを作成するために、File.separatorも使用することができます。また、System.getPropertyメソッドのSystem.getProperty(“file.separator”)からこのプロパティも取得することができます。上記のプログラムは、以下のように変更してシステムに依存しないコードにすることもできます。
String separator = File.separator;
System.out.println("File Serapartor = "+separator);
separator = System.getProperty("file.separator");
System.out.println("File Serapartor = "+separator);
runProcess("javac -cp src src"+separator+"com"+separator+"scdev"+separator+"files"+separator+"Test.java");
System.out.println("**********");
runProcess("java -cp src com"+separator+"scdev"+separator+"files"+separator+"Test Hi Pankaj");
上記と同じ出力が得られます。これで、別のJavaプログラムからJavaプログラムをコンパイルおよび実行するためにRuntime execメソッドを使用する方法のすべてです。printLines()メソッドとrunProcess()メソッドは、この投稿から取得されています。