تعرف على ant
تعرف على ant
الهدف من هذا المقال هو تعريف الـ ant لمطوري الجافا الذين لم يستعملوا هذه الأداة من قبل. و لتبين الفائدة المرجوة من هذه الأداة سنعقد مقارنة بين مشروعين أحدها يتم إنشاؤه و ترجمته باستعمال سطر الأوامر و الآخر باستعمال الـ Ant . متابعة ممتعة
أ.1. مقدمة
Ant عبارة عن مشروع مفتوح المصدر مقدم من Apache مكتوب بالجافا، الهدف من كل هذا هو توفير أداة تسمح بأتممة العمليات المتكررة بكثرة طيلة المدة التي تستغرقها كتابة المشروع.
Ant متوفر للتحميل على العنوان التالي:
لتقريب الصورة و توضيحها أكثر ، يمكن مقارنة Ant بالأداة الشهيرة make الخاصة بنظام التشغيل unix . لكن Ant موجه للعمل بعض النظر عن نظام التشغيل الذي يعمل عليه.
حجز الزاوية في ant هو ملف XML يحوي مجموعة الأوامر الواجب تنفيذها، توفر الأداة مجموعة من العمليات الشائع استعمالها (على هيئة java class) ، كما أنه من الممكن كتابة أوامر أخرى لأتممتها حسب حاجة المبرمج,
شهرة ant و قوته دفعت بـمختلف IDE الخاصة بالجافا بدعمه، يمكنك إيجاد ant في مختلف الـ IDE المتوفر للـ java كـ Eclipse و Netbeans
أ.2. تنصيب ANT :
تنصيب ANT سهل جدا حيث أنه يكفي عمل التالي:
- فك ضغط الـ ant في مجلد (مثلا D:\apache-ant-1.7.1)
- إنشاء متغير نظام جديد اسمه ANT_HOME حيث يكون محتواه مسار المجلد السابق.
- إضافة %ANT_HOME% إلى المتغير path
ب. إنشاء مشروع باستعمال سطر الأوامر:
في هذا الدرس سنضع كل نوع من الملفات لوحده:
- الكود المصدري (ملفات .java) في مجلد src
- ملفات .class في مجلد bin
- ملفات .jar في مجلد exe
لإنشاء هذه المجلدات ما علينا سوى استعمال الأمر Md متبوعا باسم المجلد لإنشائه (في linux يجب استبدال الـ md بـ mkdir و الـ \ بالـ /)
سينتج لنا التشعب التالي:
ب.1. الترجمة:
ننشئ المجلد src فقط الآن باستعمال الأمر
| Md src |
الصنف التالي يقوم بإظهار العبارة الشهيرة Hello World في شاشة سطر الأوامر
| package org.sdf;
public class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World”); } } |
كما هو ظاهر من اسم الـ package يجب وضع الملف HelloWorld.java الذي يحوي هذا الصنف في التشعب src/org/sdf
الآن سنقوم بترجمة البرنامج و من ثم تشغيله
| md bin
javac -sourcepath src -d bin\ src\org\sdf\HelloWorld.java java -cp bin org.sdf.HelloWorld |
ستظهر لك العبارة الشهيرة:
Hello World
لاحظ أنه صار لنا الآن التشعب التالي:
ب.2. إنشاء ملف الـ jar :
إنشاء ملف الـ jar ليس بالأمر الصعب و إنما يمر بعدة مراحل و هي كالتالي:
- إنشاء ملف manifest يحتوي على اسم الـصنف الرئيسي في المشروع main-class
- إنشاء المجلد exe
- و من ثم القيام بتوليد الـ jar
يمكن القيام بكل هذا عن طريق سطر الأوامر و ذلك كالتالي:
| echo Main-Class: org.sdf.HelloWorld>Manifest
md exe jar cfm exe\HelloWorld.jar Manifest -C bin . |
بعد تنفيذ هذه الأوامر يصبح التشعب على النحو التالي:
ب.3. تنفيذ البرنامج:
لتنفيذ البرنامج نكتب الأمر التالي:
| java -jar exe\HelloWorld.jar |
ج. إنشاء المشروع باستعمال ANT
سنقوم الآن بإنشاء ملف build.xml الخاص بمشروعنا و الذي سيحوي الأهداف الأربعة التالية:
Clean ، compile ،jar و run
ج.1. الهدف clean
الغاية من هذا الهدف هو القيام بعملية “تنظيف” للمشروع و حذف كل الملفات المؤقتة و الزائدة التي نتجت بعد ترجمة المشروع.
| <target >
<delete dir=”bin”/> <delete dir=”exe”/> </target> |
كما تلاحظون فإنه تتم مناداة المهمة delete مرتين، مرة لحذف ملفات الـ class ومرة لحذف ملف الـ Jar
ج.2. الهدف compile
سنستعمل هذا الهدف لإنشاء المجلد bin و من ثم ترجمة الملفات الموجودة في المجلد src و وضع الملفات الناتجة في المجلد bin
| <target>
<mkdir dir=”bin”/> <javac srcdir=”src” destdir=”bin”/> </target> |
إنشاء المجلد يتم باستعمال المهمة mkdir أما الترجمة فتتم باستعمال المهمة javac
ج.3.الهدف jar
سنستعمل هذا الهدف لإنشاء مجلد exe لنضع فيه ملف الـ jar الخاص بمشروعنا فيه
| <target >
<mkdir dir=”exe”/> <jar destfile=”exe/HelloWorld.jar” basedir=”bin”> <manifest> <attribute value=”org.sdf.HelloWorld”/> </manifest> </jar> </target> |
إنشاء المجلد يتم بواسطة المهمة mkdir أما إنشاء الـ jar فيتم باستعمال المهمة jar
ج.4. الهدف run:
نستعمل هذا الهدف لتشغيل ملف الـ jar الذي تم إنشاؤه في الخطوة السابقة
| <target >
<java jar=”exe/HelloWorld.jar” fork=”true”/> </target> |
تستعمل المهمة java لتشغيل ملف الـ jar أما الـ fork= »true » فالغرض منها تشغيل المشروع في JVM جديدة
ج.5. ترتيب المهمات:
من الواضح جدا أن بعض المهمات السابقة يجب أن تنقذ قبل أخرى أو أن بعض المهمات تحتاج إلى نتائج مهمة أخرى، فمثلا لا يمكن تشغيل ملف jar إذا لم تكن لدينا ملفات .class و لا يمكن أن تكون هناك ملفات .class إذا لم نقم بترجمة المشروع …
يوفر ant وسيلة لتبين الترابط الموجود بين المهمات و ذلك عن طريق الـ attribut المسمى depends
المثال التالي يوضح كيف أنه يجب تنفيذ المهمة compile قبل المهمة jar
| <target depends=”compile”>
<mkdir dir=”exe”/> <jar destfile=”exe/HelloWorld.jar” basedir=”bin”> <manifest> <attribute value=”org.sdf.HelloWorld”/> </manifest> </jar> </target>
|
و الآن بعد أن بيننا كل مهمة لوحدها فإن مجموع هذه المهمات يصبح على الشكل التالي:
| <project default=”run”>
<target> <delete dir=”bin”/> <delete dir=”exe”/> </target> <target depends=”clean”> <mkdir dir=”bin”/> <javac srcdir=”src” destdir=”bin”/> </target> <target depends=”compile”> <mkdir dir=”exe”/> <jar destfile=”exe/HelloWorld.jar” basedir=”bin”> <manifest> <attribute value=”org.sdf.HelloWorld”/> </manifest> </jar> </target> <target depends=”jar”> <java jar=”exe/HelloWorld.jar” fork=”true”/> </target> </project> |
و عليه فإنه من الممكن تشغيل المشروع عن طريق كتابة الأوامر التالية:
| ant clean
ant compile ant jar ant run |
و بما أننا قد حددنا الترابط الموجود بين كل المهمات فإنه يمكن أيضا كتابة الأمر التالي فقط
| ant run |
أو حتى الأمر التالي فقط
| ant |
بحكم أننا ممرنا للـ attribut المسمى default الخاص بالمشروع القيمة run و الذي معناه أنه يجب على ant تنفيذ الهدف run إذا لم يتم تحديد أي هدف لتنفيذه
ج.6. تحسين ملف الـ build.xml:
لا شك أنكم قد لاحظتم أنه تم استعمال نفس أسماء المجلدات أكثر من مرة في نفس ملف build.xml ماذا لو أردنا تغييرأسماء المجلدات ، بلا شك يتوجب علينا إعادة تسمية المجلدات في كل الملف، من أجل هذا يوفر ant إمكانية استعمال الـ properties و إرفاق قيم بها.
كما أنه من الممكن معرفة ما هي العمليات التي يقوم بها ant لحظة وقوعها و ذلك باستعمال المهمة echo
و عليه يصبح ملف الـ build.xml على الشكل التالي:
| <project default=”run”>
<property value=”src”/> <property value=”bin”/> <property value=”exe”/> <property value=”org.sdf.HelloWorld”/> <target> <delete dir=”${bin.dir}”/> <delete dir=”${jar.dir}”/> <echo message=”clean is done”/> </target> <target depends=”clean”> <mkdir dir=”${bin.dir}”/> <javac srcdir=”${src.dir}” destdir=”${bin.dir}”/> <echo message=”compile is done”/> </target> <target depends=”compile”> <mkdir dir=”${jar.dir}”/> <jar destfile=”${jar.dir}/sdf.jar” basedir=”${bin.dir}”> <manifest> <attribute value=”${main-class}”/> </manifest> </jar> <echo message=”creating JAR file”/> </target> <target depends=”jar”> <java jar=”${jar.dir}/sdf.jar” fork=”true”/> </target> </project> |
د. مقارنة بين ANT و سطر الأوامر:
يمكن عقد مقارنة بسيطة بين ANT و سطر الأوامر على النحو التالي:
|
Command ligne |
build.xml |
| md bin javac -sourcepath src -d bin\ src\org\sdf\HelloWorld.java |
<target> <mkdir dir=”bin”/> <javac srcdir=”src” destdir=”bin”/> </target> |
| echo Main-Class: org.sdf.HelloWorld>Manifest md exe jar cfm exe\HelloWorld.jar MonManifest -C bin . |
<target> <mkdir dir=”exe”/> <jar destfile=”exe/HelloWorld.jar” basedir=”bin”> <manifest> <attribute value=”org.sdf.HelloWorld”/> </manifest> </jar> </target> |
| java -jar exe\HelloWorld.jar | <target> <java jar=”exe/HelloWorld.jar” fork=”true”/> </target> |
هـ. خاتمة:
يوفر ANT خدمات للمبرمج تجنبه تكرير نفس الأعمال و المهمات الروتينية على نفس المشروع مما يزيد من إنتاجيته، استعمال ant لملفات xml يجعل ملف build.xml واضح و سهل القراءة
هناك أدوات أخرى تسمح بأتممة العمليات على مشاريع الجافا نذكر على سبيل المثال الأداة maven
| عنوان المقال الأصلي:
Prise en main d’Ant رابط المقال الأصلي: http://skebir.developpez.com/tutoriels/java/ant/ كاتب المقال الأصلي: سليم كبير الترجمة (بتصرف): Djug تمت الترجمة بعون الله في 08.07.2009 |




جزاك الله خيرا الموضوع مميز وواضح كمية التعب فيه
لكن لي عتب صغير هو عدم وضوح بعض الأمور بسسب مشاكل تعدد اللغات
” لإنشائه (في linux يجب استبدال الـ md بـ mkdir و الـ \ بالـ /)
سينتج لنا التشعب التالي:
ب.1. الترجمة:”
لاحظ أن التشعب غير موجود
لكن مشكور جدا على جهدك
topquarck
يوليو 15, 2009 في 9:03 م
مقالة جميلة جداً أخ djug
أتمنى ان نرى مقالات أخرى حول ant
تحياتي
علاء
يوليو 16, 2009 في 11:55 م
شكراً ملاحظات رائعة
.
.
كنت أراها كثيراً ولا أعرف فائدتها الحقيقية
وفي عالم الJ2ME مكتبة J2ME Polish التي تبين أنها تعتمد كلياً على Ant لتنفيذ أعمالها والpreprocessing.
Omar Al-Dolaimy
يوليو 24, 2009 في 4:55 م
@topquarck:
سأحاول تفادي الأخطاء في المرات القادمة شكرا جزيلا لك
@علاء: حسب التفرغ و التمكن و الوقت و … أمور أخرى
@Omar Al-Dolaimy:
من فضلك …حدثنا أكثر عن هذه المكتبة
djug
يوليو 24, 2009 في 4:59 م