# أباتشي ميفن

برنامج ميڤن (بالإنجليزية: Maven) هو أداة برمجية تستخدم في إدارة المشاريع وأتمتة البناء. برغم أن هذه اللغة استخدمت في البداية في لغة البرمجة جافا ولكن يمكن استخدامها كذلك لبناء وإدارة المشاريع التي كتبت بلغة سي شارب وروبي وسكالا وغيرها من اللغات. يعمل برنامج ميڤن بطريقة مشابهة لأداة أباتشي أنت ولكنه يعتمد على مبادئ مختلفة ويعمل بوسيلة أكثر اختلافا في العمق. تستضيف مؤسسة برمجيات أباتشي أداة ميڤن وقد كانت هذه المؤسسة سابقا جزءا من مشروع جاكارتا.
يستخدم ميڤن بناء يعرف بنموذج كائن المشروع (بالإنجليزية: Project Object Model) أو ما يعرف اختصارا بـ POM لوصف مشروع البرمجية الذي سيتم بناؤه واعتماده على الوحدات الخارجية والمكونات وترتيب البناء. ويأتي ميڤن مع أهداف معرفة مسبقا لأداء مهام محددة معرفة جيدا مثل ترجمة الشيفرة ووضعها في حزمة واحدة.
يقوم ميڤن بشكل ديناميكي بتنزيل مكتبات الجافا وإضافات ميڤن من مستودع واحد أو أكثر. يوفر ميڤن دعما مدمجا لاستعادة الملفات من مستودع ميڤن 2 الرئيسي ومستودعات ميڤن الأخرى ويمكن أن يحمّل الأدوات إلى مستودعات محددة بعد القيام ببناء ناجح للبرنامج. تعمل الذاكرة الخبيئة التي تتكون من الأدوات التي تم تحميلها كوسيلة أولية لمزامنة ناتج المشاريع الموجودة على نظام محلي.
بني ميڤن باستخدام بناء يعتمد على استخدام الإضافة (Plug-In) ويسمح باستغلال أي تطبيق يمكن التحكم به من خلال مدخل قياسي. نظريا، يسمح هذا المبدأ لأي شخص بكتابة إضافة تتداخل مع أدوات البناء (المترجمات وأدوات اختبار الوحدة وغيرها) الخاصة بأي لغة أخرى. أما في الواقع؛ فإنه قد تم الحد من دعم واستخدام لغات البرمجة الأخرى ما عدا الجافا إلى أقل حد ممكن وتوجد حاليا إضافة لإطار.NET يتم الحفاظ عليها وبينما تتوافر إضافة خاصة بلغة سي/سي++ أصلية تتم صيانتها من أجل استخدامها في ميڤن-نيتف و ميڤن-نار الخاصين بميڤن 2.

## مثال

يتم تكوين مشاريع ميڤن باستخدام نموذج مشروع الكائن الذي يتم تخزينه في ملف pom.xml وفيما يلي مثال مصغر على هذا الملف:
يقوم POM بتعريف معرف وحيد للمشروع (الإحداثيات) وبتعريف اعتماده كذلك على إطار جيه يونت، وعلى أي حال يعتبر هذا كافيا لبناء مشروع وتنفيذ اختبار الوحدة المترافق مع المشروع. يحقق ميڤن هذا عن طريق احتضان فكرة الاتفاقية عند التكوين مما يعني أن أداة ميڤن توفر قيما افتراضية جيدة لتكوين المشروع. يشمل هيكل الأدلة (بالإنجليزية: directory) في مشروع ميڤن اصطلاحي عادي مدخلات الأدلة التالية:
| اسم الدليل | الهدف |
| project home | يحوي ملف pom.xml وجميع الأدلة الفرعية. |
| src/main/java | يحوي الشيفرة المصدرية النهائية المكتوبة بلغة جافا الخاصة بالمشروع. |
| src/main/resources | يحوي مصادر نهائية للمشروع مثل ملفات الملكية. |
| src/test/java | يحوي كلاسات الاختبار (JUnit أو حالات اختبار TestNG على سبيل المثال) الخاصة بالمشروع. |
| src/test/resources | يحوي المصادر اللازمة للاختبار. |
ومن ثم تنفيذ الأمر:
الذي سيقوم بترجمة ملفات الجافا وتنفيذ أي اختبارات وحزم الشيفرة النهائية والشيفرة والمصادر في ملف داخل target/my-app-1.0.jar (على فرض أن اسم الأداة هو my-app وتحمل النسخة رقم 1.0).
باستخدام ميڤن نفسه؛ يوفر المستخدم تكوينا خاصا بالمشروع فقط بينما تقوم الإضافات المكوَّنة بالعمل الفعلي الخاص بترجمة المشروع وتنظيف الأدلة الهدف وتنفيذ اختبارات الوحدة وتوليد مستندات API وهلم جرا. وعادة لا يتوجب على المستخدمين كتابة الإضافات بأنفسهم؛ وذلك على النقيض من Ant وmake التي يكتب فيها المرء إجراءات لازمة لتنفيذ المهام آنفة الذكر.

## المبادئ
### نموذج كائن المشروع

يوفرPOM كل التكوين اللازم لمشروع منفرد. يتضمن التكوين العام اسم المشروع واسم المالك وتبعياته للمشاريع الأخرى. يمكن تكوين المراحل المنفردة من عملية البناء وتنفيذها كإضافات (بالإنجليزية: Plug-Ins). على سبيل المثال، يمكن أن يطوع المرء إضافة المترجم لاستخدام نسخة الجافا 1.5 في التصريف أو تحديد إمكانية القيام بحزم المشروع حتى لو فشلت بعض وحدات الاختبار.
يجب أن يتم تقسيم المشاريع الكبرى إلى وحدات متعددة أو مشاريع فرعية يحوي كل منها POM خاصا بها. ويمكن ساعتها كتابة جذر POM حيث من الممكن باستخدامه ترجمة آو تصريف جميع الوحدات باستخدام أمر واحد ويمكن أن ترث مجموعة POM التكوين من مجموعات POM أخرى. وترث جميع نماذج الكائن POMs من Super POM تلقائيا. يوفر Super POM تكوينا تلقائيا مثل أدلة المصدر التلقائية والإضافات التلقائية وهكذا.

### الإضافات

تكمن معظم وظيفية ميڤن في الإضافات حيث تقدم الإضافة مجموعة من الأهداف التي يمكن تنفيذها باستخدام التركيب التالي:
مثلا؛ يمكن تصريف مشروع الجافا باستخدام إضافة المترجم التي تنتج هدفا للتصريف عن طريق تنفيذ الأمر التالي: mvn compiler:compile
توجد إضافات تختص بالبناء والاختبار وإدارة التحكم بالمصدر وإدارة خادم الويب وإنتاج مشروع إكليبس وغيرها الكثير. يتم تقديم وتكوين الإضافات في قسم <plugins>- من ملف pom.xml وتضمّن بعض الإضافات في كل مشروع تلقائيا وتمتلك إعدادات تلقائية ملموسة. وبرغم ذلك سيكون من المرهق أن يضطر المرء إلى تنفيذ أهداف عدة لبناء واختبار وحزم مشروع ما:
إلا أن مفهوم دورة حياة ميڤن يقوم بمعالجة هذا الأمر.

### دورات حياة البناء

دورة حياة البناء هي قائمة من المراحل ذات الأسماء التي يمكن استخدامها لترتيب تنفيذ الهدف. إحدى دورات الحياة القياسية المعروفة في حالة ميڤن هي دورة الحياة التلقائية (default lifecycle) والتي تتضمن المراحل التالية بنفس الترتيب:
* process-resources
* compile
* process-test-resources
* test-compile
* test
* package
* install
* deploy
يمكن ربط الأهداف التي تقدمها الإضافات بمراحل مختلفة من دورات الحياة. على سبيل المثال؛ يتم قرن الهدف "compiler:compile" مع مرحلة compile بينما يتم ربط الهدف surefire:test مع مرحلة الاختبار phase. عند تنفيذ الأمر التالي:
سيقوم ميڤن بتنفيذ جميع الأهداف المقترنة بكل المراحل وصولا إلى مرحلة الاختبار. وهكذا سيتم تنفيذ هدف «resources:resources المقترن بمرحلة process-resources ومن ثم compiler:compile», إلى أن ينفذ هدف surefire:test في النهاية.
يحوي ميڤن أيضا دورات حياة قياسية لتنظيف المشروع وإنتاج موقع المشروع. لو كان التنظيف جزءا من دورة الحياة الافتراضية لتم تنظيف المشروع في كل مرة يتم بناؤه فيها وهو أمر غير مرغوب به ولذا منح التنظيف دورة حياة خاصة به.
بفضل دورات الحياة التلقائية؛ يمكن بناء واختبار وتثبيت كل مشروع ميڤن باستخدام الأمرmvn install.

### الاعتماديات

ألمح قسم المثال إلى الآلية التي يعالج فيها ميڤن مسألة الاعتمادية. فالمشروع الذي يحتاج مكتبة الإسبات (Hibernate) مثلا يمكنه بكل بساطة أن يعلن عن إحداثيات مشروع الإسبات في ملف POM. سيقوم ميڤن تلقائيا بتحميل الاعتماديات التي تحتاجها مكتبة الإسبات (وتدعى الاعتماديات المتنقلة) وتخزينها في مستودع المستخدم المحلي. يستخدم مستودع ميڤن 2 المركزي Maven 2 Central Repository تلقائيا للبحث عن المكتبات ولكن يمكن للمستخدم تكوين المستودعات المستخدمة (مثال: مستودعات الشركة الخاصة) في POM.
توجد محركات بحث مثل Maven Central والتي يمكن استخدامها لإيجاد الأحداث الخاصة بمكتبات المصادر المفتوحة والأطر البرمجية. يمكن أن تعتمد المشاريع التي تيم تطويرها على جهاز واحد على بعضها خلال المستودع المحلي. يعتبر المستودع المحلي تركيب مجلد بسيط يعمل كذاكرة مخبوءة لتنزيل الاعتماديات وكموقع تخزين مركزي للقطع التي يتم بناؤها محليا. يقوم الأمر mvn install ببناء مشروع ووضع binaries الخاصة به في المستودع المحلي. ويمكن للمشاريع الأخرى أن تستفيد من هذا المشروع عن طريق تحديد إحداثياته في POM الخاصة بها.

## مقارنة ميڤن أباتشي مع الأدوات المشابهة له
### مقارنة ميڤن مع أنت

يكمن الفرق الرئيسي بين ميڤن وأنت في أن تصميم ميڤن يتعامل مع كل المشاريع على أساس أن لها تركيبا معينا ومجموعة من تدفقات العمل المدعومة الخاصة بالمهام (مثال: الحصول على المصادر من تحكم المصدر وترجمة المشروع واختبار الوحدة إلخ). بينما تدعم معظم مشاريع البرمجيات المؤثرة هذه العمليات ولها بالفعل تركيب معرّف جيدا؛ فإن إحدى شروط ميڤن هي تعريف تركيبه وتطبيق عملياته في ملف POM. وبذا فإن ميڤن يعتمد على ميثاق يخص تعريف المشاريع وقاسمة تدفق العمل في المهام التي تدعمها جميع مشاريع ميڤن عموما.
يبدو هذا القيد على التصميم مماثلا للطريقة التي تتعامل فيها بيئات التطوير المتكاملة مع المشاريع وله فوائد جمة مثل تعريف المشروع بإيجاز وإمكانية التكامل الأوتوماتيكي لمشروع ميڤن مع أدوات التطوير الأخرى مثل IDEs وخوادم البناء وغيرها.
أما الجانب السلبي لهذه الطريقة فهي حاجتها إلى مستخدم يعنى أولا بفهم ماهية المشروع من وجهة نظر ميڤن والطريقة التي يعمل بها ميڤن مع المشاريع وذلك لأن ما يحدث عند تنفيذ مرحلة في ميڤن ليس بالأمر الذي يمكن ملاحظته فورا عند اختبار ملف مشروع ميڤن. ويعتبر هذا التركيب الضروري عائقا عند ترحيل مشروع مكتمل إلى ميڤن وذلك بسبب صعوبة أن يتم تبنيه من قبل طرق أخرى.
لا تتواجد المشاريع في أداة أنت فعليا من المنظور التقني للأداة. يعمل أنت مع سكريبتات بناء XML التي يتم تعريفها في ملف أو أكثر. يقوم بمعالجة الأهداف من هذه الملفات بحيث يقوم كل هدف بتنفيذ المهام. تقوم كل مهمة بتنفيذ عملية تقنية مثل تنفيذ الترجمة أو نسخ الملفات من هنا وهناك. يتم تنفيذ المهام بالأساس بالترتيب الذي يعطى من الاعتمادية على المهام الأخرى. وبذا يمكن القول بأن أنت هي أداة تعمل على سلسلة المهام سوية وتنفيذها بناء على الاعتمادية الداخلية والشروط المنطقية.
إن المزايا التي يقدمها أنت عديدة أيضا؛ فهو يعمل مع لغة XML محسنة بهدف الوصول إلى تعريف أوضح لعمل كل مهمة واعتمادية كل واحد منها. كما ويمكن العثور على كل المعلومات حول المهام التي سيتم تنفيذها بواسطة هدف أنت الذي يمكن إيجاده في سكريبت أنت. يمكن لمطور غير خبير بأنت أن يحدد عادة ماهية عمل سكريبت أنت بسيط عن طريق معاينة السكريبت فقط غير أن هذا الأمر لا ينطبق عادة في حالة ميڤن.
وعلى أي حال فلا يمكن لمطور متمرس يستخدم مشروع أنت حديثا أن يخمّن ما هو التركيب الأعلى في المستوى لسكريبت أنت وماهية عمله دون معاينة السكريبت بالتفصيل. اعتمادا على تعقيد السكريبت؛ يمكن أن يصبح هذا تحديا شاقا. بينما في حالة ميڤن؛ بإمكان مطور قد عمل سابقا على مشاريع ميڤن أخرى أن يعاين تركيب مشروع ميڤن لم يره قبلا وينفذ تدفق العمل القياسي الخاص بميڤن وهو على علم بالناتج المتوقع.
بالإمكان استخدام سكريبت أنت يتم تعريفه ليتصرف بطريق منتظمة مع كل المشاريع الموجودة في مجموعة عاملة أو في منظمة ما. عندما يزيد عدد وتعقيد المشاريع يصبح من السهل أن يضل الهدف طريقه عن النظام الذي قصد في البداية. ليست هذه بالمشكلة الكبيرة في حالة ميڤن وذلك لأن الأداة تفترض دائما طريقة معينة للقيام بالأشياء.
لاحظ أنه من الممكن أيضا تمديد وتكوين ميڤن بطريقة بعيدة عن الطريقة التي يتبعها ميڤن في تنفيذ المهام المنوطة به.

## دمج بيئات التطوير المتكاملة

تتواجد الإضافات التي تجرى على بيئات التطوير المتكاملة الشائعة العديدة لتوفير التكامل مع ميڤن باستخدام ألية بناء بيئات التطوير وأدوات تحرير المصدر بحيث تسمح لميڤن بترجمة المشاريع من داخل بيئة التطوير ولضبط متغير classpath الخاص بإتمام الشيفرة البرمجية وتظليل أخطاء المترجم وخلافه. من الأمثلة على بيئات التطوير المتكاملة الشائعة والتي تدعم التطوير باستخدام أداة ميڤن:
* إكليبس
* نت‌بينز
* إنتيليج إيديا
* جي بيلدر
توفر هذه الإضافات القدرة على تحرير POM أو استخدام POM لتحديد مجموعة كاملة من اعتماديات المشروع مباشرة داخل بيئة التطوير.
تتم مصادرة بعض خصائص بيئات التطوير المدمجة عندما لا تقوم بيئات التطوير بإجراء عمليات الترجمة بعد الآن. على سبيل المثال يمكن لـ Eclipse's JDT أن يعيد ترجمة ملف جافا مصدري منفرد بعد أن يتم تحريره. تعمل الكثير من بيئات التطوير مع مجموعة مسطحة من المشاريع بدلا من التسلسل الهرمي للمجلدات التي يفضلها ميڤن. ويعقد هذا استخدام أنظمة SCM في بيئات التطوير باستخدام ميڤن.

## الخلفية التاريخية لميڤن

بدأت أداة ميڤن التي اخترعها جاسون فان زايل من أباتشي توربين في عام 2002. في عام 2003 تم التصويت على ميڤن وقبوله كمشروع على مستوى عالي ضمن مؤسسة برمجيات أباتشي. في يوليو من عام 2004؛ أطلق ميڤن كمعلم بالغ الأهمية تم الإعلان عن نسخة 1.0 من ميڤن 2 في أكتوبر 2005 بعد حوالي 6 أشهر من بقائها في دورات نسخة بيتا.

## مستقبل أباتشي ميڤن

بدأت معلومات ميڤن 3.0 بالتقاطر في عام 2008. أطلقت نسخة بيتا الأولى من ميڤن 3.0 في أبريل عام 2010 بعد إطلاق نسخة ألفا 8. أعاد ميڤن 3.0 صياغة البنية التحتية لـ Project Builder الجوهري بحيث تم فصل تمثيل الملفات المعتمدة على POM عن تمثيل الكائنات في الذاكرة. زاد هذا الأمر من احتمالية أن تستفيد إضافات ميڤن 3.0 من ملفات التعريف الخاصة بالمشاريع التي لا تعتمد على الـ XML. تتضمن اللغات المقترحة لغة روبي (وهي موجودة في النمذجة الخاصة التي قدمها جاسون فان زيل) ولغة يامل وجروفي وقد أجرى دون براون من شركة أطلاسيان عملا تجريبيا لملفات تعريف لغة يامل التي تعتمد على POM (تتضمن سكريبت تحويل خارجيا لتنفيذها).
وقد أولي اهتمام خاص لتأكيد التوافق بين ميڤن 2 ميڤن 3 وبالنسبة لمعظم المشاريع فإن الترقية لميڤن 3 لا تستلزم أي تعديلات على بنية المشروع. شهدت نسخة البيتا الأولى من ميڤن 3 تقديم خصائص بنية متوازية والتي تعزز تكوين عدد من النوى على آلة متعددة النوى والتي يتم موائمتها خصيصا للمشاريع الكبرى متعددة الوحدات.