האם חשבת פעם אם זה אפשרי להדמיה ולהריץ תוכנית Java מתוך תוך תוכנית Java נוספת? אנו יכולים להשתמש בפונקציה Runtime.exec(String 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());
}
}
שים לב להבחנה בין פקודות javac
ו־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
כדי ליצור את הפקודות בדרך תלוית פלטפורמה. נוכל גם לקבל את המאפיין הזה מהשיטה getProperty של System באמצעות System.getProperty("file.separator")
. התוכנית למעלה יכולה להשתנות כמו שמתואר למטה לקוד תלוי פלטפורמה.
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");
תקבלו את אותו הפלט. זהו הכול בנוגע לשימוש בשיטת exec של Runtime כדי להדפיס ולהריץ תוכנית Java מתוך תוכנית Java נוספת. שיטות printLines() ו- runProcess() נלקחו מהפוסט הזה פוסט.
Source:
https://www.digitalocean.com/community/tutorials/compile-run-java-program-another-java-program