| # | القسم |
|---|---|
| 1 | ما هو Maven؟ |
| 2 | المشكلة التي يحلّها Maven |
| 3 | العرف قبل الإعداد |
| 4 | البنية القياسية لمشروع Maven |
| 5 | تثبيت Maven |
| 6 | التحقق من التثبيت وأول مشروع |
| 7 | اختبار — مقدمة إلى Maven |
| 8 | تطبيق عملي — إنشاء مشروع وفحصه |
| 9 | الخلاصة |
Apache Maven أداة أتمتة بناء (build automation) لمشاريع Java. يأخذ شفرة المصدر وينتج مخرجاً (ملف .jar أو .war) بتنسيق كل الخطوات: التجميع، الاختبارات، التغليف، وإدارة التبعيات.
عملياً، يلبي Maven ثلاث حاجات أساسية :
| الحاجة | ما يفعله Maven |
|---|---|
| بناء المشروع | يجمع الشفرة وينتج أثراً (.jar، .war) |
| إدارة التبعيات | ينزّل المكتبات اللازمة تلقائياً |
| التوحيد | يفرض بنية مشروع واحدة في كل مكان |
قلب Maven ملف واحد، pom.xml (Project Object Model)، يصف المشروع: هويته، تبعياته، وطريقة بنائه. هذه «الوصفة» التي ينفّذها Maven.
بلا Maven، بناء مشروع Java يعني التجميع يدوياً بـ
javac، وتنزيل كل مكتبة يدوياً، وإدارة الـ classpath بنفسك. يؤتمت Maven ذلك كله انطلاقاً من ملف واحد.
تمرين مصغّر — اذكر الحاجات الأساسية الثلاث التي يلبيها Maven.
بناء المشروع (تجميع + إنتاج أثر .jar/.war)، وإدارة التبعيات (تنزيل المكتبات)، والتوحيد (فرض بنية مشروع واحدة).
قبل Maven، كان كل مشروع Java يُبنى «باليد» أو بسكربتات منزلية. ذلك طرح مشكلات متكررة :
| المشكلة (بلا Maven) | الحل (مع Maven) |
|---|---|
إيجاد ملفات .jar وتنزيلها واحداً واحداً | التصريح في pom.xml، تنزيل تلقائي |
| تعارض إصدارات المكتبات | حل انتقالي تلقائي |
| «يُجمَع عندي لا عندك» | بناء قابل لإعادة الإنتاج وموحَّد |
| كل مشروع مرتَّب بشكل مختلف | شجرة مجلدات مفروضة |
الفكرة المركزية: مطوّر ينضم إلى مشروع Maven يعرف فوراً أين الشفرة، وأين الاختبارات، وكيف يطلق البناء — أياً كانت الشركة أو المشروع.
# مع Maven، بناء مشروع مجهول يختصر إلى:
mvn packageيحوّل Maven سؤال «كيف نبني هذا المشروع؟» — الذي كان يستغرق ساعات أحياناً — إلى أمر عالمي واحد.
تمرين مصغّر — اكتب الأمر الوحيد الذي يكفي لبناء مشروع Maven مجهول.
mvn packageالمبدأ المركزي لـ Maven هو «العرف قبل الإعداد» (convention over configuration). بدل وصف كل شيء صراحة، ينطلق Maven من قيم افتراضية معقولة. إن احترمت الأعراف، فلا تكاد تحتاج إلى إعداد.
أمثلة أعراف افتراضية :
| العنصر | الموقع المتوقَّع افتراضياً |
|---|---|
| شفرة المصدر الرئيسية | src/main/java |
| الموارد الرئيسية | src/main/resources |
| شفرة الاختبار | src/test/java |
| الأثر المنتج | target/ |
نقارن الفلسفتين :
| المقاربة | النتيجة |
|---|---|
| إعداد كل شيء | مرنة لكن مطوَّلة، عرضة للأخطاء |
| عرف افتراضي | موجزة، متسقة بين المشاريع، سريعة البدء |
يمكنك دائماً إعادة تعريف الأعراف إن لزم، لكن 95 % من المشاريع تكتفي بالقيم الافتراضية. إعداد أقل = أخطاء أقل.
كل مشروع Maven يتبع الشجرة نفسها. معرفتها تسمح بالتنقّل فوراً في أي مشروع.
تفصيل المجلدات :
| المسار | الدور |
|---|---|
pom.xml | وصفة المشروع (في الجذر) |
src/main/java | شفرة المصدر للتطبيق |
src/main/resources | ملفات غير Java (.properties، .xml، صور) |
src/test/java | أصناف الاختبارات الوحدية |
src/test/resources | موارد تستخدمها الاختبارات |
target/ | مجلد الخرج: أصناف مجمَّعة والأثر النهائي |
تمرين مصغّر — في أي مجلد تضع صنفاً لاختبار وحدي، وفي أي مجلد ملفاً application.properties؟
الاختبار الوحدي في src/test/java، و application.properties في src/main/resources.
# شجرة نموذجية تُرى من سطر الأوامر
mon-projet/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/ # مثال com/exemple/App.java
│ │ └── resources/ # مثال application.properties
│ └── test/
│ └── java/ # مثال com/exemple/AppTest.java
└── target/ # مولَّد: لا تؤرشف (.gitignore)المجلد
target/يُعاد توليده عند كل بناء. أضفه إلى.gitignore: لا نؤرشف أبداً الآثار المجمَّعة.
يحتاج Maven إلى JDK (Java Development Kit) مثبَّت مسبقاً، لأنه يعتمد على المجمّع javac. يجب أن يشير المتغيّر JAVA_HOME إلى هذا JDK.
حسب نظامك :
| النظام | أمر التثبيت |
|---|---|
| Windows (مع Chocolatey) | choco install maven |
| macOS (مع Homebrew) | brew install maven |
| Linux (Debian/Ubuntu) | sudo apt install maven |
التثبيت اليدوي (كل المنصات) :
# 1. التحقق أولاً من وجود Java
java -version
# يجب أن يعرض إصداراً 17+ مثلاً
# 2. تعيين JAVA_HOME (مثال Linux/macOS)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
# 3. تنزيل Maven من maven.apache.org، فك الضغط،
# ثم إضافة المجلد bin/ إلى PATH
export PATH=$PATH:/opt/apache-maven-3.9.6/binعلى Windows، يُضبَط
JAVA_HOMEفي «متغيرات البيئة». على Linux/macOS، أضف سطرexportإلى~/.bashrcأو~/.zshrcليصبح دائماً.
بعد تثبيت Maven، نتحقق من عمله ونولّد أول هيكل مشروع.
# التحقق من الإصدار المثبَّت
mvn -versionخرج نموذجي :
Apache Maven 3.9.6
Maven home: /opt/apache-maven-3.9.6
Java version: 17.0.9, vendor: Eclipse Adoptiumلتوليد مشروع فارغ يحترم الأعراف، نستخدم archetype (قالباً) :
# يولّد مشروعاً «quickstart» قياسياً
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false| الأمر | الأثر |
|---|---|
mvn -version | يعرض إصدار Maven و Java |
mvn archetype:generate | يولّد مشروعاً من قالب |
mvn package | يبني الأثر في target/ |
أول
mvnبطيء: ينزّل Maven إضافاته في ذاكرة تخزين محلية (~/.m2/repository). البناءات التالية أسرع بكثير.
تمرين مصغّر — اكتب الأمر الذي يعرض إصدار Maven المثبَّت (وإصدار Java).
mvn -versionالسؤال 1: ماذا يعني الملف pom.xml في مشروع Maven؟
a) شفرة المصدر الرئيسية للتطبيق
b) Project Object Model: الوصفة التي تصف المشروع وبناءه
c) النتيجة المجمَّعة للمشروع
d) ملف سجلات
الإجابة: b) — يصف pom.xml (Project Object Model) هوية المشروع وتبعياته وطريقة بنائه.
السؤال 2: أين يتوقع Maven شفرة المصدر الرئيسية افتراضياً؟
a) code/
b) target/main
c) src/main/java
d) java/source
الإجابة: c) — بالعرف، الشفرة الرئيسية في src/main/java، والاختبارات في src/test/java.
السؤال 3: ماذا يعني «العرف قبل الإعداد»؟
a) يجب إعداد كل شيء صراحة
b) يستخدم Maven قيماً افتراضية معقولة تقلّل الإعداد اللازم
c) لا يمكن أبداً تغيير سلوك Maven
d) ليس لـ Maven ملف إعداد
الإجابة: b) — باحترام الأعراف الافتراضية يبقى pom.xml أدنى. يمكن دائماً إعادة تعريف عرف إن لزم.
السؤال 4: أي مجلد يولّده Maven تلقائياً ولا يجوز أرشفته؟
a) src/main/java
b) src/test/java
c) target/
d) resources/
الإجابة: c) — يحتوي target/ الأصناف المجمَّعة والأثر؛ يُعاد توليده عند كل بناء ويجب أن يظهر في .gitignore.
السؤال 5: ماذا يحتاج Maven ليعمل؟
a) خادم ويب
b) JDK مثبَّت و JAVA_HOME مضبوط
c) قاعدة بيانات
d) Node.js
الإجابة: b) — يعتمد Maven على المجمّع javac في JDK؛ يجب أن يشير JAVA_HOME إلى هذا JDK.
تحقق من تثبيت Maven، وولّد مشروعاً «quickstart» اسمه mon-app في المجموعة com.exemple، ثم ابنه وحدّد الأثر المنتج.
# 1. التحقق من Maven و Java
mvn -version
# 2. توليد المشروع من قالب quickstart
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
# 3. الدخول إلى المشروع وفحص البنية
cd mon-app
ls -R # أو « tree » إن وُجد
# 4. بناء المشروع
mvn package
# 5. تحديد الأثر المولَّد
ls target/النتيجة المتوقعة :
target/
├── classes/
├── mon-app-1.0-SNAPSHOT.jar <-- الأثر المنتج
└── ...
BUILD SUCCESSيجب أن تحتوي الشجرة المولَّدة :
mon-app/
├── pom.xml
└── src/
├── main/java/com/exemple/App.java
└── test/java/com/exemple/AppTest.javaإذا عرض
mvn packageالقيمةBUILD SUCCESSوظهر.jarفيtarget/، فسلسلة Maven تعمل. اللاحقة-SNAPSHOTتشير إلى إصدار قيد التطوير (انظر الدرس 02).
pom.xml الوصفة الوحيدة التي تصف المشروع وبناءه.src/main/java، src/test/java، src/main/resources، الخرج في target/.JAVA_HOME؛ نتحقق بـ mvn -version.الدرس 02 — ملف pom.xml: تشريح وصفة Maven بالتفصيل — إحداثيات المشروع، الخصائص، ووراثة الأب.
جميع الحقوق محفوظة. يُحظَر نسخ هذه الدورة أو نشرها أو استخدامها أو تكييفها، كلياً أو جزئياً، دون إذن كتابي مسبق من الدكتور هيثم رحومة.
دورة من إعداد الدكتور هيثم رحومة — تطوير ونشر حلول البيانات