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.