Hoe een Java-programma compileren en uitvoeren vanuit een ander Java-programma

Heb je er ooit over nagedacht of het mogelijk is om een ​​Java-programma te compileren en uit te voeren vanuit een ander Java-programma? We kunnen Runtime.exec(String cmd) gebruiken om opdrachten uit te voeren naar het onderliggende besturingssysteem. We zullen dezelfde aanpak gebruiken om een ​​Java-programma te compileren en uit te voeren vanuit een ander Java-programma.

Compileer en voer Java-programma uit vanuit een ander Java-programma

Laten we een eenvoudig Java-programma schrijven dat zal worden gecompileerd en uitgevoerd vanuit een ander Java-programma.

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);
        }

    }

}

Hier is het andere programma waarin ik de klasse Test compileer en uitvoer.

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());
      }

}

Merk het verschil op tussen de javac en java opdrachten. We moeten dit doen omdat de Eclipse-werkdirectory de projecthoofdmap is, maar mijn klassenbronmap is src. Wanneer ik het bovenstaande programma vanuit Eclipse uitvoer, is hier de geproduceerde uitvoer.

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

Hier is de uitvoer wanneer ik hetzelfde programma vanaf de opdrachtregel uitvoer, waarbij de werkmap de projecthoofdmap is.

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$ 

Het bovenstaande programma zal prima werken op Unix-systemen, maar het zal niet werken op Windows-systemen omdat de Windows-bestandsscheider verschilt van Unix-bestandsscheiders. Om ervoor te zorgen dat het platformonafhankelijk is, kunnen we opdrachten doorgeven als een argument aan de hoofdfunctie. De hoofdfunctie zal er als volgt uitzien:

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();
    }
    
}

We kunnen ook File.separator gebruiken om de opdrachten op een platformonafhankelijke manier te maken. We kunnen deze eigenschap ook verkrijgen via de methode getProperty van System System.getProperty("file.separator"). Het bovenstaande programma kan worden aangepast zoals hieronder voor systeemonafhankelijke code.

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");

Je krijgt dezelfde uitvoer als hierboven. Dat is alles voor het gebruik van de Runtime exec-methode om een ​​Java-programma te compileren en uit te voeren vanuit een ander Java-programma. De methoden printLines() en runProcess() zijn overgenomen uit deze post.

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