如何從另一個 Java 程式編譯並運行 Java 程式

你曾經想過是否可以從另一個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());
      }

}

請注意javacjava命令的區別。我們需要這樣做是因為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