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

Java / المتوسط / الدرس 12

الحزم ومسار الأصناف والوحدات

افهم أثر تنظيم المصدر والأسماء الثنائية وحل الاعتماد والتغليف في تطبيق Java محزم.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • حل اسم صنف مؤهل من جذر البحث.
  • تمييز مسار الأصناف ومسار الوحدات.
  • شرح requires وexports وopens دون تجاوز التغليف.

عامل الحزمة كجزء من هوية النوع

تشارك package في الاسم الثنائي؛ يختلف training.app.Main من Main في الحزمة غير المسماة ولو تطابق الملف. تساعد imports المصدر على الإشارة للأنواع ولا تنزل الاعتماديات أو تغير بحث التشغيل. لا يحل import إضافي تضارب مكتبتين تعرفان الاسم الثنائي نفسه.

ترجم بجذر خرج واضح مثل javac -d out وشغل java -cp out training.app.Main. يقع الجذر فوق training/app لا داخله. تجمع JAR المدخلات بمسارات الأسماء وقد تضم مدخل تشغيل في manifest. اجعل الأثر واعتمادياته قابلين للتكرار بدلاً من إعداد IDE خفي.

راقب الوحدات المسماة وغير المسماة

ينتمي Main العادي عند التشغيل بمسار الأصناف إلى وحدة غير مسماة، وينتمي String إلى java.base المسماة. يطبع المثال false ثم java.base. يصف ذلك نمط التشغيل المعزول لا كل Main في المشاريع؛ ويغير التشغيل كوحدة مسماة سياقه.

ظهر نظام الوحدات في Java9 ويتاح في أساس17. تعلن الوحدة الاعتماد وتصدير الحزم في module-info.java. تختلف هوية الوحدة عن الحزمة وقد تضم عدة حزم. تبقى الحزمة جزء الاسم المؤهل وتضيف الوحدة بنية الاعتماد والتغليف.

java فحص سياق التشغيل الحالي
public class Main {

 public static void main(String[] args) throws Exception {
System.out.println(Main.class.getModule().isNamed());
System.out.println(String.class.getModule().getName());
 }
}
الناتج المتوقع
false
java.base

يستخدم التحقق مسار الأصناف فتبقى Main غير مسماة ويقع String في java.base.

حدد الاعتماد وما تكشفه الوحدة

تعلن requires الاعتماد وتكشف exports واجهة حزمة عامة وفق قواعد الوصول. تسمح opens بالوصول الانعكاسي حسب نطاقها وليست مرادفة. استخدم كشفاً أو فتحاً مؤهلاً عند حصر المستهلكين، ولا تفتح الداخل كله لإسكات خطأ إطار دون فهم الحاجة.

الواصف التالي جزء تفسيري لوحدة تحتوي فعلاً أصناف training.api، وليس مشروعاً كاملاً وحده. يلزم java.base ضمنياً. تدعم ServiceLoader مقدم الخدمة عبر uses وprovides لكنها لا تلغي الإصدار أو العمر. تفيد الوحدة مع عقود واعتماديات مقصودة.

java واصف وحدة توضيحي
module training.core {
    exports training.api;
}

يحتاج الجزء بنية مصادر وأصناف حزمة مطابقة فيبقى غير قابل للتشغيل.

افحص الهوية الثنائية قبل نقل الملفات

تعرض Class.getName الاسم الثنائي المستخدم للبحث. تقع Main في المثال بالحزمة غير المسماة وتطبع ذلك. يشمل اسم المحزم حزمته وقد يحوي المتداخل علامة دولار. قد تختلف صياغة المصدر والثنائي، فاستخدم أدوات المترجم والتغليف لا تحويل نص اعتباطياً.

افحص أثرًا محلياً بـjar --list --file وصنفاً بـjavap عند مشكلة تغليف؛ ولا تتصل هذه الأدوات بعملية إنتاج في الدرس. قد يسبب اعتماد مفقود وقت التشغيل NoClassDefFoundError رغم نجاح البناء سابقاً. قارن الآثار الفعلية برسم الاعتماد.

java فحص الهوية الثنائية والحزمة
public class Main {

 public static void main(String[] args) throws Exception {
System.out.println(Main.class.getName());
System.out.println(Main.class.getPackageName().isEmpty());
 }
}
الناتج المتوقع
Main
true

لا يعلن المثال حزمة؛ لذلك اسمه Main وحزمته غير مسماة.

افصل فشل الحل والوصول والإصدار

تختلف فئة غائبة ووحدة غير محلولة وحزمة غير متاحة وإصدار ملف غير مدعوم. احفظ الأمر والإصدار وهوية الأثر والخطأ أولاً، ولا تخلط إصلاحات المسارين. تغير --add-opens و--add-exports حد وصول ولا توفر اعتماداً غائباً أو تشغل شيفرة أحدث على JVM قديمة.

اختبر الأثر المحزم بنمطه المقصود لا IDE وحده. تحقق من البناء النظيف والاعتماد والموارد والإصدارات في مجلد معزول. تجعل هذه الممارسة النشر قابلاً للتفسير والتكرار ولا تبرر تعقيد تمرين واحد قبل الحاجة.

الأخطاء الشائعة وإصلاحها

ClassNotFoundException

لماذا يحدث؟
يغيب الاسم الثنائي عن بحث المحمل.
كيف تصلحه؟
افحص الاسم ومدخلات الأثر والجذر.
كيف تتجنب تكراره؟
اختبر أمر التشغيل المحزم.

FindException: Module not found

لماذا يحدث؟
وحدة مطلوبة غائبة أو بمسار خاطئ.
كيف تصلحه؟
افحص الهوية ووفر الاعتماد المعتمد.
كيف تتجنب تكراره؟
طابق رسم البناء والتشغيل.

InaccessibleObjectException

لماذا يحدث؟
تجاوز الانعكاس حداً غير مفتوح.
كيف تصلحه؟
استخدم واجهة مدعومة أو ضبطاً محدوداً مبرراً.
كيف تتجنب تكراره؟
تجنب تجاوزات الوصول الشاملة.

اختبر فهمك

1. الصنف training.app.Main وملفه out/training/app/Main.class. ما الأمر؟

اعرض الحل المشروح

java -cp out training.app.Main. الجذر out والاسم يشمل الحزمة؛ يخلط -cp out/training/app Main الحزمة بالجذر.

2. هل تسمح exports training.api بالانعكاس الحر لكل الداخل؟

اعرض الحل المشروح

لا؛ تكشف الواجهة العامة للحزمة المحددة وفق القواعد، وتضبط opens الانعكاس ويمكن تقييدها. لا تكشف أيهما الحزم الأخرى تلقائياً.

أهم ما تعلمته

  • يشمل الاسم الثنائي هوية الحزمة.
  • للمسارين عقدا حل مختلفان.
  • التصدير والفتح وتوافق الإصدار مسائل مستقلة.

المراجع الرسمية