مقدمة إلى Maven

6 دقيقة

جدول المحتويات


1 — ما هو Maven؟

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)، وإدارة التبعيات (تنزيل المكتبات)، والتوحيد (فرض بنية مشروع واحدة).

↑ العودة إلى الأعلى


2 — المشكلة التي يحلّها Maven

قبل Maven، كان كل مشروع Java يُبنى «باليد» أو بسكربتات منزلية. ذلك طرح مشكلات متكررة :

المشكلة (بلا Maven)الحل (مع Maven)
إيجاد ملفات .jar وتنزيلها واحداً واحداًالتصريح في pom.xml، تنزيل تلقائي
تعارض إصدارات المكتباتحل انتقالي تلقائي
«يُجمَع عندي لا عندك»بناء قابل لإعادة الإنتاج وموحَّد
كل مشروع مرتَّب بشكل مختلفشجرة مجلدات مفروضة

الفكرة المركزية: مطوّر ينضم إلى مشروع Maven يعرف فوراً أين الشفرة، وأين الاختبارات، وكيف يطلق البناء — أياً كانت الشركة أو المشروع.

bash
# مع Maven، بناء مشروع مجهول يختصر إلى:
mvn package

يحوّل Maven سؤال «كيف نبني هذا المشروع؟» — الذي كان يستغرق ساعات أحياناً — إلى أمر عالمي واحد.

تمرين مصغّر — اكتب الأمر الوحيد الذي يكفي لبناء مشروع Maven مجهول.

عرض الحل
bash
mvn package

↑ العودة إلى الأعلى


3 — العرف قبل الإعداد

المبدأ المركزي لـ Maven هو «العرف قبل الإعداد» (convention over configuration). بدل وصف كل شيء صراحة، ينطلق Maven من قيم افتراضية معقولة. إن احترمت الأعراف، فلا تكاد تحتاج إلى إعداد.

أمثلة أعراف افتراضية :

العنصرالموقع المتوقَّع افتراضياً
شفرة المصدر الرئيسيةsrc/main/java
الموارد الرئيسيةsrc/main/resources
شفرة الاختبارsrc/test/java
الأثر المنتجtarget/

نقارن الفلسفتين :

المقاربةالنتيجة
إعداد كل شيءمرنة لكن مطوَّلة، عرضة للأخطاء
عرف افتراضيموجزة، متسقة بين المشاريع، سريعة البدء

يمكنك دائماً إعادة تعريف الأعراف إن لزم، لكن 95 % من المشاريع تكتفي بالقيم الافتراضية. إعداد أقل = أخطاء أقل.

↑ العودة إلى الأعلى


4 — البنية القياسية لمشروع Maven

كل مشروع 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.

bash
# شجرة نموذجية تُرى من سطر الأوامر
mon-projet/
├── pom.xml
├── src/
   ├── main/
   ├── java/        # مثال com/exemple/App.java
   └── resources/   # مثال application.properties
   └── test/
       └── java/        # مثال com/exemple/AppTest.java
└── target/              # مولَّد: لا تؤرشف (.gitignore)

المجلد target/ يُعاد توليده عند كل بناء. أضفه إلى .gitignore: لا نؤرشف أبداً الآثار المجمَّعة.

↑ العودة إلى الأعلى


5 — تثبيت Maven

يحتاج 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

التثبيت اليدوي (كل المنصات) :

bash
# 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 ليصبح دائماً.

↑ العودة إلى الأعلى


6 — التحقق من التثبيت وأول مشروع

بعد تثبيت Maven، نتحقق من عمله ونولّد أول هيكل مشروع.

bash
# التحقق من الإصدار المثبَّت
mvn -version

خرج نموذجي :

Apache Maven 3.9.6
Maven home: /opt/apache-maven-3.9.6
Java version: 17.0.9, vendor: Eclipse Adoptium

لتوليد مشروع فارغ يحترم الأعراف، نستخدم archetype (قالباً) :

bash
# يولّد مشروعاً «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).

عرض الحل
bash
mvn -version

↑ العودة إلى الأعلى


7 — اختبار — مقدمة إلى Maven

السؤال 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.

↑ العودة إلى الأعلى


8 — تطبيق عملي — إنشاء مشروع وفحصه

المطلوب

تحقق من تثبيت Maven، وولّد مشروعاً «quickstart» اسمه mon-app في المجموعة com.exemple، ثم ابنه وحدّد الأثر المنتج.


التصحيح — سلسلة الأوامر المتوقعة

bash
# 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).

↑ العودة إلى الأعلى


9 — الخلاصة

النقاط التي يجب تذكّرها

  1. Maven أداة أتمتة بناء لـ Java: يجمع، يختبر، يغلف، ويدير التبعيات.
  2. pom.xml الوصفة الوحيدة التي تصف المشروع وبناءه.
  3. العرف قبل الإعداد: قيم افتراضية تقلّل ما يجب كتابته.
  4. البنية القياسية: src/main/java، src/test/java، src/main/resources، الخرج في target/.
  5. يحتاج Maven إلى JDK و JAVA_HOME؛ نتحقق بـ mvn -version.

ما يلي

الدرس 02 — ملف pom.xml: تشريح وصفة Maven بالتفصيل — إحداثيات المشروع، الخصائص، ووراثة الأب.

↑ العودة إلى الأعلى


جميع الحقوق محفوظة. يُحظَر نسخ هذه الدورة أو نشرها أو استخدامها أو تكييفها، كلياً أو جزئياً، دون إذن كتابي مسبق من الدكتور هيثم رحومة.

دورة من إعداد الدكتور هيثم رحومة — تطوير ونشر حلول البيانات