Kompilieren und Ausführen eines Java Programms: So geht’s!

Einleitung

Haben Sie sich jemals gefragt, ob es möglich ist, ein Java-Programm direkt aus einem anderen Java-Programm zu kompilieren und auszuführen, ohne manuell in die Befehlszeile einzugreifen? Mit der Methode Runtime.exec(String cmd) haben wir die Möglichkeit, systeminterne Befehle effizient an das zugrunde liegende Betriebssystem zu übermitteln. Dieser leistungsstarke Ansatz ermöglicht es uns, Java-Programme dynamisch auszuführen und dabei die gesamte Steuerung innerhalb des ursprünglichen Programms zu behalten. In diesem Tutorial zeigen wir Ihnen Schritt für Schritt, wie Sie diese Technik anwenden können, um ein Java-Programm aus einem anderen Java-Programm zu kompilieren und auszuführen.

Kompilieren und Ausführen eines Java-Programms aus einem anderen Java-Programm

Schreiben wir ein einfaches Java-Programm, das aus einem anderen Java-Programm kompiliert ist und führen es aus.


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

Unterschiede in den Befehlen

Beachten Sie die Unterschiede zwischen den Befehlen javac und java. Dies ist erforderlich, da das Arbeitsverzeichnis von Eclipse das Projektstammverzeichnis ist, während sich mein Klassenquellverzeichnis in src befindet.

Hier ist die Ausgabe, die beim Ausführen des obigen Programms aus Eclipse ensteht:


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
  

Kompilieren und Ausführen eines Java Programms plattformunabhängig machen

Das obige Programm funktioniert einwandfrei auf Unix-Systemen, jedoch nicht auf Windows-Systemen, da Windows-Dateitrennzeichen sich von Unix-Dateitrennzeichen unterscheiden. Um das Programm plattformunabhängig zu machen, können wir Befehle als Argumente an die Hauptfunktion übergeben.


public static void main(String[] args) {
    try {
        if(args.length < 2) throw new Exception("Erforderliche Argumente fehlen");
        runProcess(args[0]);
        runProcess(args[1]);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  

Wir können auch File.separator verwenden, um plattformunabhängige Befehle zu erstellen. Hier ist ein Beispiel:


String separator = File.separator;
System.out.println("Dateitrennzeichen = " + separator);

separator = System.getProperty("file.separator");
System.out.println("Dateitrennzeichen = " + 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 dieselbe Ausgabe wie zuvor.

Fazit für Kompilieren und Ausführen eines Java Programms

Die Verwendung der Runtime.exec-Methode ermöglicht es uns, ein Java-Programm aus einem anderen Java-Programm zu kompilieren und auszuführen, was besonders hilfreich für automatisierte Prozesse oder komplexe Anwendungen sein kann. Die in diesem Beispiel verwendeten Methoden printLines() und runProcess() stammen aus einem anderen Beitrag und wurden für diesen Zweck angepasst. Dieser Ansatz kann zudem mit File.separator oder System.getProperty("file.separator") plattformunabhängig gestaltet werden, um sicherzustellen, dass das Programm sowohl auf Unix- als auch auf Windows-Systemen reibungslos funktioniert.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: