Avez-vous déjà pensé s’il est possible de compiler et d’exécuter un programme Java à partir d’un autre programme Java ? Nous pouvons utiliser Runtime.exec(String cmd)
pour envoyer des commandes au système d’exploitation sous-jacent. Nous utiliserons la même approche pour compiler et exécuter un programme Java à partir d’un autre programme Java.
Compiler et exécuter un programme Java à partir d’un autre programme Java
Écrivons un programme Java simple qui sera compilé et exécuté à partir d’un autre programme Java.
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);
}
}
}
Voici l’autre programme où je compile et exécute la classe Test.
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());
}
}
Remarquez la différence dans les commandes javac
et java
. Nous devons le faire car le répertoire de travail d’Eclipse est le répertoire racine du projet mais mon répertoire source de classes est src. Lorsque j’exécute le programme ci-dessus à partir d’Eclipse, voici la sortie produite.
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
Voici la sortie lorsque j’exécute le même programme à partir de la ligne de commande, le répertoire de travail est le répertoire racine du projet.
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$
Le programme ci-dessus fonctionnera bien sur les systèmes Unix mais il ne fonctionnera pas sur les systèmes Windows car le séparateur de fichiers Windows est différent des séparateurs de fichiers Unix. Pour s’assurer qu’il est indépendant de la plateforme, nous pouvons passer les commandes en tant qu’argument de la fonction principale. La fonction principale ressemblera à ceci :
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();
}
}
Nous pouvons également utiliser File.separator
pour créer les commandes de manière indépendante de la plateforme. Nous pouvons également obtenir cette propriété à partir de la méthode System getProperty System.getProperty("file.separator")
. Le programme ci-dessus peut être modifié comme suit pour obtenir un code indépendant du système.
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");
Vous obtiendrez le même résultat que ci-dessus. C’est tout pour l’utilisation de la méthode Runtime exec pour compiler et exécuter un programme Java à partir d’un autre programme Java. Les méthodes printLines() et runProcess() sont tirées de ce message.
Source:
https://www.digitalocean.com/community/tutorials/compile-run-java-program-another-java-program