Wie man ein Java-Programm von einem anderen Java-Programm aus kompiliert und ausführt

Hast du jemals darüber nachgedacht, ob es möglich ist, ein Java-Programm aus einem anderen Java-Programm zu kompilieren und auszuführen? Wir können Runtime.exec(String cmd) verwenden, um Befehle an das zugrunde liegende Betriebssystem zu senden. Wir werden denselben Ansatz verwenden, um ein Java-Programm aus einem anderen Java-Programm zu kompilieren und auszuführen.

Java-Programm aus einem anderen Java-Programm kompilieren und ausführen

Schreiben wir ein einfaches Java-Programm, das aus einem anderen Java-Programm kompiliert und ausgeführt wird.

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 ist das andere Programm, in dem ich die Testklasse kompiliere und ausführe.

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

}

Beachte den Unterschied in den javac– und java-Befehlen. Wir müssen dies tun, weil das Arbeitsverzeichnis von Eclipse das Projektstammverzeichnis ist, aber mein Klassenquellverzeichnis ist „src“. Wenn ich das obige Programm aus Eclipse heraus ausführe, wird hier die Ausgabe erzeugt.

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 ist die Ausgabe, wenn ich dasselbe Programm von der Kommandozeile ausführe; das Arbeitsverzeichnis ist das Projektstammverzeichnis.

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$ 

Der oben genannte Programm wird in Unix-Systemen gut funktionieren, aber es wird nicht in Windows-Systemen funktionieren, weil das Dateitrennzeichen von Windows sich von dem von Unix unterscheidet. Um sicherzustellen, dass es plattformunabhängig ist, können wir Befehle als Argument an die Hauptfunktion übergeben. Die Hauptfunktion wird so aussehen:

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

Wir können auch File.separator verwenden, um die Befehle plattformunabhängig zu erstellen. Wir können diese Eigenschaft auch aus der Methode System.getProperty("file.separator") von System getProperty erhalten. Das obige Programm kann für systemunabhängigen Code wie folgt geändert werden:

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

Sie erhalten die gleiche Ausgabe wie oben. Das ist alles zur Verwendung der Runtime exec-Methode, um ein Java-Programm von einem anderen Java-Programm zu kompilieren und auszuführen. Die Methoden printLines() und runProcess() stammen aus diesem Beitrag.

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