다른 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$ 

해당 프로그램은 유닉스 시스템에서는 잘 작동하지만 윈도우 시스템에서는 작동하지 않을 것입니다. 왜냐하면 윈도우 파일 구분자가 유닉스 파일 구분자와 다르기 때문입니다. 플랫폼 독립적으로 만들기 위해 명령을 main 함수의 인수로 전달할 수 있습니다. main 함수는 다음과 같이 보일 것입니다:

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 메소드를 사용하는 방법에 대한 설명이 끝났습니다. printLines() 및 runProcess() 메소드는 이 포스트에서 가져왔습니다.

Source:
https://www.digitalocean.com/community/tutorials/compile-run-java-program-another-java-program