Java / دليل حلول تحريري
تشخيص مسار الأصناف والوحدات وإصدار الصنف
صنف التحميل والحل والوصول وإصدار الشيفرة قبل تغيير التشغيل أو إضعاف التغليف.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد تظهر Could not find or load main class أوClassNotFoundException أوNoClassDefFoundError أوFindException أوInaccessibleObjectException أوUnsupportedClassVersionError. تمثل حدوداً مختلفة لا يصلحها كلها «أضف JAR».
قد يعمل البرنامج في IDE ويفشل محزماً لاختلاف الاعتماديات أوالجذر أوالتشغيل أوخيارات الوحدة.
افهم الأسباب المحتملة
- قد يختلف الاسم الثنائي والجذر أو يغيب اعتماد التشغيل أو يفشل حل الواصف أو يتجاوز الانعكاس حزمة مغلقة.
- قد يتجاوز هدف الصنف بيئة النشر. لا يعيد نقل الملفات أو فتح الحزم دعم الشيفرة أو واجهاتها لإصدار أقدم.
احفظ سياق التشغيل الفعلي
سجل هدف الترجمة وإصداري الأداتين والأثر والمعاملات والمجلد دون أسرار الخيارات، وقارن البيئة الناجحة. أعد البناء في خرج مؤقت نظيف لاستبعاد القديم واعتمد أول سبب لا التغليف الأخير. لا تعدل خدمة مضبوطة أثناء الدراسة.
تحقق من الاسم الثنائي وجذر البحث
إن كانت الحزمة training.app والصنف Main فشغل training.app.Main من جذر فوق training/app. افحص JAR محلية بأداة jar للمدخل والاعتماد؛ لا تضبط imports التحميل. قد يتبع NoClassDefFoundError فشل تهيئة سابقاً، فافحص السبب قبل افتراض غياب الملف.
أنشئ إعادة صغيرة للمشكلة تحتوي الحزمة المقصودة والاعتماد اللازم لها فقط، ثم قارن مسار الاسم الثنائي المتوقع بالمدخل الموجود فعلاً داخل الأثر. شغّل من جذر نظيف تعرف محتوياته، ولا تضف مجموعة كبيرة من الملفات على أمل أن يختفي الخطأ. أضف كل اعتماد بعد فهم دوره وسبب الحاجة إليه. فقد يؤدي مسار ضخم إلى تحميل نسخة قديمة من صنف مكرر، فيبدو التشغيل ناجحاً لكنه يستخدم بناءً مختلفاً عما أردت اختباره. الهدف هو تفسير سبب العثور على النوع الصحيح، لا مجرد العثور على أي نوع يحمل الاسم نفسه. احتفظ بأمر التشغيل وبهوية الملفات كي يستطيع زميل تكرار النتيجة دون إعدادات خفية.
افصل حل الوحدة من الوصول
يتعلق غياب الوحدة بالهوية والمسار، ويتعلق الانعكاس غير المتاح بالتصدير أوالفتح والتكامل. فضّل الواجهة المدعومة والواصف الصحيح. قد يصح فتح محدود مراجع لكن الأعلام الشاملة لا توفر اعتماداً ولا تصبح حلاً دائماً بلا تفسير. اختبر نمط التشغيل المقصود صراحة.
أصلح عدم تطابق الإصدار المثبت
يحتاج UnsupportedClassVersionError تشغيلًا متوافقاً أو بناءً للهدف مثل javac --release17. يفحص الخيار واجهات المنصة مع اللغة والصنف. لا توفر المعاينة واجهة خيوط21 لبناء17. تحقق من الاعتماديات المتعدية لا أصناف التطبيق فقط.
استخدم فحص هوية محلياً صغيراً
يعرض المثال الكامل وحدة المنصة واسمه الثنائي ولا يفحص تطبيقاً آخر أوإعداداً سرياً. قارن أساساً مضبوطاً بهوية الأثر الفاشل. تختلف مخرجات الأدوات والإصدارات، فاحفظ الفعلي ولا تختلق قيمة ثابتة.
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(String.class.getModule().getName());
System.out.println(Main.class.getName());
}
}
java.base
Main
يعمل المثال كـMain ويقرأ وصف نوعه ونوع String القياسي فقط.
تحقق من نجاح الإصلاح
تحقق من أمر التشغيل المحزم نفسه في مجلد جديد معزول وباستخدام بيئة التشغيل المدعومة، لا إعدادات بيئة التطوير وحدها. أدرج الموارد والاعتماديات المطلوبة فعلاً، وتأكد من بدء التطبيق ثم نجاح عملية صغيرة ذات معنى. أزل أعلام تجاوز الوصول المؤقتة التي لم يعد لها مبرر. احتفظ بتفسير يربط نص الخطأ بتصحيح محدد في حل الاسم أو الوصول أو توافق الإصدار. يجب أن يستطيع زميل إعادة النتيجة من الأثر والأمر الموثقين، وأن يكون النجاح بسبب تحميل النوع الصحيح من البناء الصحيح، لا بسبب ملف قديم أو مسار خفي وفرته بيئة التطوير دون علمك.
امنع تكرار المشكلة
- اجعل البناء قابلاً للتكرار وهدفه صريحاً واختبر أثر النشر واعتمادياته. راجع كشف الوحدة كقرار واجهة ووثق متطلبات التشغيل في الأتمتة.