مقدمة: التعرف على الخطأ الذي يخيف المبتدئين
لقد كتبت برنامجًا بلغة Java، وقمت بتجميعه، وحزمته في ملف JAR، وتحاول بفخر تشغيله بنقرة مزدوجة — ولكن بدلاً من نافذة التطبيق، ترى نافذة طرفية سوداء مع رسالة مخيفة: Can't execute jar- file: "no main manifest attribute". هل هذا مألوف؟ إذا لم يكن كذلك، فاعتبر نفسك محظوظًا (حتى الآن).
هذا الخطأ هو واحد من أكثر الأخطاء شيوعًا على Stack Overflow. تخيل فقط: آلاف المطورين، من الطلاب إلى المهندسين ذوي الخبرة، واجهوا مرة واحدة على الأقل في حياتهم أن ملف JAR الخاص بهم «يرفض» التشغيل. لماذا يحدث هذا؟ الأمر أن Java ليست مجرد «احزم وشغل». يجب أن تعرف الآلة الافتراضية بوضوح: أي فئة تحتوي على نقطة الدخول؟ بدون هذه المعلومات، يبقى ملف JAR مجرد أرشيف عادي، وليس برنامجًا قابلًا للتنفيذ.
في هذه المقالة، سنفهم ما هو البيان (manifest)، وكيف يرتبط بنقطة الدخول، والأهم من ذلك — كيفية جعل ملف JAR الخاص بك يعمل بدون أخطاء. سننتقل من البسيط إلى المعقد: من البناء اليدوي في سطر الأوامر إلى إعداد بيئة التطوير المتكاملة (IDE). هيا بنا!
ما هو البيان (manifest) وما فائدته؟
كل ملف JAR (Java Archive) يحتوي بداخله على مجلد META-INF، وفيه ملف MANIFEST.MF. هذا ليس مجرد أثر تقني، بل هو «دليل الاستخدام» الحقيقي للآلة الافتراضية Java.
تخيل كتابًا بدون فهرس. أنت تعلم أن فيه فصولًا، لكنك لا تعرف من أي صفحة تبدأ القراءة. نفس الشيء يحدث تقريبًا مع ملف JAR بدون تحديد الفئة الرئيسية. ترى الآلة الافتراضية العديد من الفئات، لكنها لا تعرف أي منها يحتوي على الدالة public static void main(String[] args).
ملف MANIFEST.MF النموذجي يبدو هكذا:
Manifest-Version: 1.0Created-By: 17.0.2 (Oracle Corporation)Main-Class: com.example.Mainأهم سطر هنا هو Main-Class. وهو يحدد الاسم الكامل للفئة (مع الحزمة) التي يجب على Java تشغيلها. إذا كان هذا السطر مفقودًا أو غير صحيح — تحصل على ذلك الخطأ «no main manifest attribute».
لماذا قد يكون البيان فارغًا أو غير صحيح؟
- البناء اليدوي عبر
jar— إذا لم تحدد العلامة-eأو لم تنشئ بيانك الخاص. - البناء في IDE بدون إعداد — بعض بيئات التطوير (خاصة الإصدارات القديمة) لا تضيف
Main-Classتلقائيًا. - خطأ في التسمية — على سبيل المثال، كتبت
mainبحرف صغير أو نسيت تحديد الحزمة. - الترميز والتنسيق — في البيان، كل سطر فارغ في نهاية الملف مهم.
كيفية إنشاء ملف JAR قابل للتنفيذ: ثلاث طرق
الطريقة 1. سطر الأوامر (تحكم يدوي)
هذه الطريقة تعطي فهمًا كاملاً للعملية. لنفترض أن لدينا فئة بسيطة HelloWorld.java:
package com.example;
public class HelloWorld { public static void main(String[] args) { System.out.println("مرحبًا بالعالم! JAR يعمل!"); }}الخطوة 1. تجميع الفئة
javac -d . HelloWorld.javaالعلامة -d . تنشئ هيكل الحزم (com/example/HelloWorld.class).
الخطوة 2. إنشاء البيان يدويًا
أنشئ ملفًا MANIFEST.MF (على سبيل المثال، في المفكرة) بالمحتوى التالي:
Manifest-Version: 1.0Main-Class: com.example.HelloWorldهام: بعد السطر الأخير، يجب أن يكون هناك سطر فارغ! بدونه، قد لا يتمكن ملف JAR من قراءة البيان.
الخطوة 3. إنشاء JAR
jar cfm HelloWorld.jar MANIFEST.MF com/example/HelloWorld.classالعلامة
المدونات
توصيات الكتب
اقرأ أيضًا