Автор оригинала: Pankaj Kumar.
Вы когда-нибудь задумывались, можно ли скомпилировать и запустить программу java из другой программы java? Мы можем использовать Runtime.exec(строка cmd) для выдачи команд базовой операционной системе. Мы будем использовать тот же подход для компиляции и запуска java-программы из другой java-программы.
Скомпилируйте и запустите программу Java из другой программы Java
Давайте напишем простую java-программу, которая будет скомпилирована и запущена из другой 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);
}
}
}
Вот другая программа, в которой я компилирую и запускаю тестовый класс.
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());
}
}
Обратите внимание на разницу в командах java и java . Нам нужно это сделать, потому что рабочий каталог Eclipse-это корневой каталог проекта, а исходный каталог моих классов-src.
Когда я запускаю вышеуказанную программу из Eclipse, вот полученный результат.
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
Вот вывод, когда я запускаю ту же программу из командной строки, рабочий каталог-это корневой каталог проекта.
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$
Вышеуказанная программа будет отлично работать в системах Unix, но она не будет работать в системах Windows, потому что разделитель файлов Windows отличается от разделителей файлов Unix.
Чтобы убедиться, что он не зависит от платформы, мы можем передавать команды в качестве аргумента основной функции . Основная функция будет выглядеть следующим образом:
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();
}
}
Мы также можем использовать File.separator для создания команд независимым от платформы способом. Мы также можем получить это свойство из System getProperty метода System.getProperty("файл.разделитель") .
Вышеуказанная программа может быть изменена, как показано ниже, для системного независимого кода.
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");
Вы получите тот же результат, что и выше. Это все для использования метода Runtime exec для компиляции и запуска программы java из другой программы java.
Методы print Lines() и run Process() взяты из этого post .