«No main manifest attribute»: لماذا لا ترى Java نقطة الدخول في JAR وكيفية إصلاح ذلك

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: التعرف على الخطأ الذي يخيف المبتدئين



لقد كتبت برنامجًا بلغة 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

العلامة

المدونات

توصيات الكتب