دورة الحياة والمراحل

6 دقيقة

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


1 — دورة حياة البناء

ينظّم Maven بناء مشروع في دورة حياة (lifecycle): سلسلة مرتَّبة من المراحل. عندما تطلب مرحلة، ينفّذ Maven كل المراحل السابقة بالترتيب.

هذا أهم مبدأ يُحفَظ :

طلب مرحلة ينفّذ تلقائياً كل ما يسبقها. إذن mvn package يطلق أيضاً validate و compile و test.

لدى Maven في الواقع ثلاث دورات حياة :

دورة الحياةالدور
defaultبناء المشروع (تجميع، اختبار، تغليف…)
cleanالتنظيف (حذف target/)
siteتوليد توثيق المشروع
bash
# تنفيذ مرحلة = تنفيذ الكل حتى تبلغها
mvn package      # يطلق validate -> compile -> test -> package

تمرين مصغّر — أي مراحل تُنفَّذ عندما تشغّل mvn package؟ اسردها بالترتيب.

عرض الحل

validatecompiletestpackage: طلب مرحلة ينفّذ تلقائياً كل ما يسبقها.

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


2 — المراحل الرئيسية

تضم دورة الحياة default مراحل كثيرة؛ هذه الأكثر استخداماً يومياً :

المرحلةماذا تفعل
validateتتحقق من صحة المشروع ووجود كل المعلومات اللازمة
compileتجمّع شفرة المصدر (src/main/java)
testتشغّل الاختبارات الوحدية
packageتغلف الشفرة المجمَّعة (.jar أو .war)
verifyتطلق اختبارات التكامل وضوابط الجودة
installتثبّت الأثر في المستودع المحلي ~/.m2
deployتنشر الأثر على مستودع بعيد مشترَك
bash
mvn validate    # تحققات أساسية
mvn compile     # + التجميع
mvn test        # + الاختبارات الوحدية
mvn package     # + إنشاء الأثر
mvn verify      # + اختبارات التكامل
mvn install     # + نسخ إلى ~/.m2
mvn deploy      # + نشر بعيد

كلما تقدّمنا في القائمة، زاد ما يفعله Maven. mvn install «السكين السويسري» للتطوير المحلي: يبني الكل ويجعل الأثر متاحاً لمشاريعك الأخرى على الجهاز نفسه.

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


3 — التجميع

تحوّل المرحلة compile شفرة Java (src/main/java) إلى bytecode (.class) في target/classes. يتولى ذلك إضافة Compiler، باستخدام javac في JDK.

يُحدَّد إصدار Java بالخصائص التي رأيناها في الدرس 02 :

xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>
bash
# تجميع الشفرة الرئيسية
mvn compile

# تجميع شفرة الاختبار أيضاً
mvn test-compile

تمرين مصغّر — في أي مجلد يُودَع الـ bytecode .class للشفرة الرئيسية بعد mvn compile؟

عرض الحل

في target/classes (مثال target/classes/com/exemple/App.class).

الخاصيةالدور
maven.compiler.sourceإصدار لغة Java المقبول في الشفرة
maven.compiler.targetإصدار الـ bytecode المولَّد

النتيجة في target/ :

target/
└── classes/
    └── com/exemple/App.class   <-- bytecode مجمَّع

إذا فشل التجميع (BUILD FAILURE)، يتوقف Maven فوراً: لا تُنفَّذ المراحل التالية (test، package). نصحّح دائماً أخطاء التجميع أولاً.

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


4 — الاختبارات (JUnit + Surefire)

تشغّل المرحلة test الاختبارات الوحدية في src/test/java. تطلقها إضافة Surefire، عادة مع إطار JUnit.

اختبار JUnit نموذجي :

java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculTest {
    @Test
    void additionDeDeuxNombres() {
        assertEquals(4, 2 + 2);
    }
}
bash
# تشغيل كل الاختبارات
mvn test

# تشغيل صنف اختبار واحد
mvn test -Dtest=CalculTest

# البناء مع تخطي الاختبارات (يُتجنَّب إلا لحالات محددة)
mvn package -DskipTests

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

عرض الحل
bash
mvn package -DskipTests
العنصرالدور
JUnitالإطار الذي يعرّف الاختبارات ويتحقق منها
Surefireإضافة Maven التي تشغّل الاختبارات الوحدية
Failsafeالإضافة التي تشغّل اختبارات التكامل (مرحلة verify)

إذا فشل اختبار واحد، يفشل البناء كله (BUILD FAILURE) ولا يُنتَج package. هذا مقصود: لا نسلّم أثراً لا تنجح اختباراته. تخطي الاختبارات بـ -DskipTests يجب أن يبقى استثناء.

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


5 — التغليف (jar / war)

تجمع المرحلة package الشفرة المجمَّعة في أثر قابل للتسليم، يُودَع في target/. يعتمد نوع الأثر على الوسم <packaging> في pom.xml.

التغليفالأثرالاستخدام
jar.jarمكتبة أو تطبيق Java مستقل
war.warتطبيق ويب يُنشَر على خادم (Tomcat…)
pom(لا شيء)مشروع أب/مجمّع، بلا شفرة
xml
<!-- اختيار نوع الأثر -->
<packaging>jar</packaging>
bash
# إنتاج الأثر
mvn package

# تحديد النتيجة
ls target/

النتيجة :

target/
├── classes/
├── mon-app-1.0.0-SNAPSHOT.jar   <-- الأثر القابل للتسليم
└── ...

يتبع اسم الأثر النمط artifactId-version.packaging. مثال: mon-app-1.0.0-SNAPSHOT.jar. هذا الملف الذي توزّعه أو تنشره.

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


6 — Install و deploy و clean

بعد package، تكمل ثلاث عمليات دورة الحياة.

الأمرالأثر
mvn installيبني + ينسخ الأثر إلى ~/.m2 (قابل لإعادة الاستخدام محلياً)
mvn deployيبني + ينشر الأثر على مستودع بعيد (Nexus/Artifactory)
mvn cleanيحذف المجلد target/ (يبدأ من الصفر)

التوليفة clean install من الأكثر شيوعاً: تضمن بناءً نظيفاً تماماً.

bash
# البدء من الصفر والبناء حتى التثبيت المحلي
mvn clean install

# البناء والنشر على المستودع البعيد للفريق
mvn clean deploy
المرحلةمن يحتاجها؟
installمطوّر يريد إعادة استخدام الأثر في مشروع محلي آخر
deployفريق / CI ينشر إصداراً للجميع
cleanأي شخص يريد تجنّب بقايا بناء سابق

mvn clean install المنعكس عندما «لم يعد يعمل بلا سبب»: يحذف clean ملفات مجمَّعة قديمة محتملة في target/.

تمرين مصغّر — اكتب الأمر الذي يبدأ من target/ نظيف ثم يثبّت الأثر في المستودع المحلي ~/.m2.

عرض الحل
bash
mvn clean install

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


7 — اختبار — دورة الحياة والمراحل

السؤال 1: ماذا يحدث عندما تشغّل mvn package؟

a) تُنفَّذ مرحلة package وحدها

b) ينفّذ Maven أيضاً كل المراحل السابقة (validate، compile، test)

c) ينشر Maven الأثر على مستودع بعيد

d) يحذف Maven المجلد target/

عرض الحل

الإجابة: b) — طلب مرحلة ينفّذ كل المراحل السابقة بالترتيب: validatecompiletestpackage.


السؤال 2: أي إضافة Maven تشغّل الاختبارات الوحدية؟

a) Compiler

b) Surefire

c) Shade

d) Jar

عرض الحل

الإجابة: b) — إضافة Surefire تشغّل الاختبارات الوحدية (مع JUnit) أثناء المرحلة test.


السؤال 3: ماذا تفعل المرحلة install؟

a) تثبّت Maven على الجهاز

b) تنسخ الأثر إلى المستودع المحلي ~/.m2

c) تنشر على Maven Central

d) تحذف target/

عرض الحل

الإجابة: b) — تنسخ install الأثر إلى ~/.m2، فيصبح قابلاً لإعادة الاستخدام من مشاريع محلية أخرى.


السؤال 4: أي وسم يحدد إن كان المشروع ينتج .jar أو .war؟

a) <scope>

b) <version>

c) <packaging>

d) <artifactId>

عرض الحل

الإجابة: c)<packaging>jar</packaging> أو <packaging>war</packaging> يثبّت نوع الأثر الذي تنتجه package.


السؤال 5: ماذا يحدث أثناء mvn package إذا فشل اختبار وحدي؟

a) يُنتَج الأثر رغم ذلك

b) يفشل البناء (BUILD FAILURE) ولا يُنتَج الأثر

c) يتجاهل Maven الاختبار

d) ينتقل Maven مباشرة إلى deploy

عرض الحل

الإجابة: b) — اختبار فاشل يوقف البناء؛ لا يُنشأ package. هذا مقصود: لا نسلّم أثراً تفشل اختباراته.

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


8 — تطبيق عملي — اجتياز دورة الحياة

المطلوب

على مشروع Maven، اجتز دورة الحياة خطوة بخطوة: نظّف، جمّع، اختبر، غلّف، ثم ثبّت محلياً. راقب في كل خطوة ما ينتجه Maven في target/.


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

bash
# 1. البدء من الصفر: يحذف target/
mvn clean

# 2. التجميع: ينتج target/classes
mvn compile
ls target/classes        # bytecode .class موجود

# 3. الاختبار: Surefire يشغّل اختبارات JUnit
mvn test

# 4. التغليف: ينتج .jar في target/
mvn package
ls target/*.jar          # mon-app-1.0.0-SNAPSHOT.jar

# 5. التثبيت في المستودع المحلي ~/.m2
mvn install

# الصيغة المختصرة الأكثر شيوعاً:
mvn clean install

النتيجة المتوقعة :

[INFO] --- compiler:compile --- (target/classes créé)
[INFO] --- surefire:test --- Tests run: 1, Failures: 0, Errors: 0
[INFO] --- jar:jar --- Building jar: target/mon-app-1.0.0-SNAPSHOT.jar
[INFO] --- install:install --- Installing ... to ~/.m2/repository/...
[INFO] BUILD SUCCESS

لاحظ ترتيب أسطر [INFO]: compile ثم test ثم jar ثم install. هذا الدليل الظاهر على أن Maven يسلسل المراحل تلقائياً بترتيب دورة الحياة.

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


9 — الخلاصة

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

  1. دورة الحياة سلسلة مرتَّبة من المراحل؛ طلب مرحلة ينفّذ كل ما يسبقها.
  2. مراحل أساسية: validatecompiletestpackageverifyinstalldeploy.
  3. compile (إضافة Compiler) تنتج الـ bytecode في target/classes.
  4. test (إضافة Surefire + JUnit) تشغّل الاختبارات؛ الفشل يوقف البناء.
  5. package تنشئ .jar/.war؛ install تنسخه إلى ~/.m2؛ clean يفرغ target/.

ما يلي

تتقن الآن Maven: البنية، و pom.xml، والتبعيات، ودورة الحياة. الوحدة 04 تتناول التحوية بـ Docker، حيث ستغلف هذه الآثار Maven في صور قابلة للنقل.

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


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

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