في هذا الدرس البسيط، سنحاول تسليط الضوء على واحدة من أقوى مميزات الــ IDE وهي خاصية بناء البرنامج بلمسة زر واحدة. وسنبحث عن كيفية عملها وراء الكواليس. (قم بتحميل المشروع من المرفقات).
والسر هو التالي :
يقوم الـ IDE (في الصورة NetBeans) بترجمة compiling وتكوين ملف الجار packaging to .jar file لمشروعك بلمسة زر واحدة. يعتمد الـ IDE طبعا في هذا على أدوات الجافا المختصة في هذا الشأن وهي الأدوات javac لترجمة البرنامج و jar لتكوين ملف الجار و java لتشغيل البرنامج. غير أن هذا الأمر ليس بالسهل بتاتا، خصوصا مع كبر البرنامج وكثرة الكلاسات وتفرعها واسأل من لا يستعمل الـ IDE عن مشاكل الــ CLASSPATH.
إذن كيف يقوم الـ IDE بتسيير كل ذلك بتلك السلاسة؟
يعتمد الــ IDE لتسيير هذه العملية (عملية البناء، أو Build) على الأداة Ant (النملة). يقوم الـ IDE بكتابة الملف build.xml اوتوماتيكيا، ومن خلال المعلومات الموجودة في هذا الملف يقوم الــ Ant ببناء البرنامج.
لكن هل من مثال توضيحي؟
طيب، اليكم المثال البسيط التالي :
public class MyClass {
private String salamMessage = "Salam Aleekoum!";
public void saySalam() {
System.out.println(salamMessage);
}
public static void main(String[] args) {
MyClass c = new MyClass();
c.saySalam();
}
}إذا أردنا القيام بعملية البناء يدويا، فسنقوم بالتالي (فرضا) :
- نقوم بوضع الكلاس السابق في مجلد src وهذا للتنظيم بحيث نضع جميع الكود سورس داخل هذا المجلد
- انشاء مجلد build لاحتواء نتيجة الترجمة (ملفات .class)
- القيام بعملية ترجمة الملفات الموجودة في المجلد src (لا يوجد في مثالنا هذا إلا الملف MyClass.java) ووضع الناتج في المجلد build.
- القيام بانشاء الملف MyProject.jar يحتوي الملفات المترجمة (الموجودة في المجلد build)
- ثم تنفيذ هذا الملف الأخير.
بدل بأن نقوم بعملية البناء باستخدام الطريقة اليدوية السابقة، سنقوم باستعمال الأداة Ant.
أول شيء، نقوم بانشاء ملف build.xml ونملأه كما يلي :
يحتوي هذا الملف على مجموعة من "الأهداف" (أو targets). أعد النظر في ملف الــ build.xml السابق وحدد الأهداف التي بداخله (<target name="...">).
ستجد ثلاثة أهداف : compile، jar و run.
لاحظ في السطر الأول من الملف، المعلومة default="run" والتي تخبر الــ Ant بأن الهدف الذي من المفترض بأن يشتغل أولا عند البناء هو الهدف run.
لاحظ أيضا بأنه في الهدف run (السطر 13) هناك معلومة تشير بأن هذا الهدف يجب بأن يسبقه هدف آخر، وهو الهدف jar (depends="jar")، وفي نفس الوقت الهدف jar (السطر 6) يجب بأن يسبقه الهدف compile (السطر 2) ، فليس بامكاننا صنع ملف جار اذا لم نقم بعملية الترجمة قبل ذلك. وبهذه الطريقة يقوم الــ Ant بتشغيل هدف تلو الآخر حسب الأولوية.
لنلاحظ الآن ماذا يوجد داخل كل هدف، ولنبدأ بالهدف compile :
<target name="compile"> <mkdir dir="classes"/> <javac srcdir="src" destdir="classes"/> </target>
الأمر الأول في هذا الهدف هو الأمر <mkdir> والذي يقوم بانشاء مجلد بالاسم الذي نعطيه له (classes في هذه الحالة).
أما الأمر الثاني فهو الأمر <javac> والذي يقوم بعملية ترجمة الملفات الموجودة في المجلد "src" ويضع نتيجة الترجمة في المجلد "classes" الذي أنشأناه من قبل.
ماذا عن الهدف jar : ؟
<target name="jar" depends="compile"> <jar destfile="MyProject.jar" basedir="classes"> <manifest> <attribute name="Main-Class" value="MyClass"/> </manifest> </jar> </target>
يستعمل هذا الهدف الأمر <jar> من أجل تجميع البرنامج في ملف جار. ويحتاج هذا الأمر إلى المعلومات التالية :
destfile اسم الملف الناتج
basedir المجلد الذي يحتوي على ملفات الكلاس المترجمة
manifest من أجل اضافة معلومة في ملف الجار التي من شأنها بأن تحدد الكلاس الرئيسي الذي سينفذ عند تنفيذ ملف الجار (في هذه الحالة MyClass).
أما الهدف الأخير، والذي هو الهدف run :
<target name="run" depends="jar"> <java jar="MyProject.jar" fork="true"/> </target>
فيحتوي على الأمر <java> الذي يقوم بتنفيذ الملف MyProject.jar الذي ينشأ عن الهدف السابق.
كيف نقوم بتنفيذ هذا الملف باستعمال الـ Ant ؟
فقط، اذهب الى المجلد حيث يوجد الملف build.xml واكتب الأمر التالي في الكنسول :
ant
سترى في الشاشة ما يلي :
وهو المطلوب.
ملاحظة :
لتثبيت الأداة، اتبع الخطوات في الموقع التالي (بالعربي).
http://dbassem.googlepages.com/ant
شكرا.