如何从另一个Java程序编译和运行Java程序

你是否曾想过是否可以从另一个Java程序中编译和运行一个Java程序?我们可以使用Runtime.exec(String cmd)来向底层操作系统发出命令。我们将使用相同的方法来从另一个Java程序中编译和运行Java程序。

从另一个Java程序中编译和运行Java程序。

让我们来编写一个简单的Java程序,可以从另一个Java程序中进行编译和运行。

package com.Olivia.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.Olivia.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
compile and run java program from another java program in eclipse
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$ 
java program to compile and run java program cmd
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");

你将会得到与上面的输出相同的结果。这就是使用Runtime exec方法从另一个Java程序编译和运行Java程序的全部内容。printLines()和runProcess()方法是从本篇帖子中提取的。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds