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