你曾經想過是否可以從另一個Java程序編譯和運行Java程序嗎?我們可以使用Runtime.exec(String cmd)
向底層操作系統發送命令。我們將使用相同的方法從另一個Java程序編譯和運行Java程序。
從另一個Java程序編譯和運行Java程序
讓我們編寫一個簡單的Java程序,將從另一個Java程序中編譯和運行。
package com.journaldev.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.journaldev.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/journaldev/files/Test.java");
System.out.println("**********");
runProcess("java -cp src com/journaldev/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/pankaj/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
Path Serapartor = /
javac -cp src src/com/journaldev/files/Test.java exitValue() 0
**********
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Start
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Hi
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/journaldev/files/Test Hi Pankaj exitValue() 0
當我從命令行運行相同的程序時,這是輸出,工作目錄是項目根目錄。
pankaj:~ pankaj$ cd /Users/pankaj/Documents/eclipse-workspace/JavaExceptions
pankaj:JavaExceptions pankaj$ javac -cp src src/com/journaldev/files/Test.java
pankaj:JavaExceptions pankaj$ javac -cp src src/com/journaldev/files/CompileRunJavaProgram.java
pankaj:JavaExceptions pankaj$ java -cp src com/journaldev/files/CompileRunJavaProgram
pwd stdout: /Users/pankaj/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
javac -cp src src/com/journaldev/files/Test.java exitValue() 0
**********
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Start
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Hi
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/journaldev/files/Test Hi Pankaj exitValue() 0
pankaj:JavaExceptions pankaj$
上述程式在 Unix 系統中可以正常運作,但在 Windows 系統中則無法運作,因為 Windows 的檔案分隔符與 Unix 的不同。為了確保其具有平台獨立性,我們可以將指令作為參數傳遞給主函數。主函數將如下所示:
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+"journaldev"+separator+"files"+separator+"Test.java");
System.out.println("**********");
runProcess("java -cp src com"+separator+"journaldev"+separator+"files"+separator+"Test Hi Pankaj");
您將獲得與上述相同的輸出。這就是使用 Runtime exec 方法從另一個 Java 程式編譯和執行 Java 程式的全部內容。printLines() 和 runProcess() 方法是從這個文章中獲取的。
Source:
https://www.digitalocean.com/community/tutorials/compile-run-java-program-another-java-program