هل فكرت يومًا في إمكانية تجميع وتشغيل برنامج 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
لإنشاء الأوامر بطريقة مستقلة عن المنصة. يمكننا أيضًا الحصول على هذه الخاصية من طريقة System getProperty باستخدام الكود 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");
ستحصل على نفس النتيجة كما هو موضح أعلاه. هذا كل شيء بالنسبة لاستخدام طريقة Runtime exec لتجميع وتشغيل برنامج Java من برنامج Java آخر. تم أخذ أساليب printLines() و runProcess() من هذا المنشور.
Source:
https://www.digitalocean.com/community/tutorials/compile-run-java-program-another-java-program