JAR في Java
حزّم ملفات الصنف المترجمة داخل jar كي ترسلها وتشغّلها كملف واحد. في Pack.java أبقِ الصنف العام Pack، اطبع packed من main، ترجم بـjavac Pack.java، ثم أنشئ Pack.jar بـjar --create --file Pack.jar Pack.class. شغّل بـjava -cp Pack.jar Pack لتعرض الشاشة packed. عرض ثانٍ يطبع shipped ويستخدم jar يذكر Main-Class كي يعمل java -jar Pack.jar. هذا الدرس تغليف jar، وليس فحص @Test في JUnit وليس طباعة وصول Records.
jar واحد، تشغيل بـ-cp
افتح Pack.java. أبقِ اسم الصنف العام Pack. احذف assertات JUnit المتبقية في SumCheck، وعروض Records المتبقية في Card، وخطوط Streams المتبقية في Pipe، وخطوات lambda المتبقية في Cue إن دفنت قصة jar. ملف التعليم برنامج صغير بـmain تغلّفه، وليس صنف اختبار بـassertEquals.
داخل Pack.main اطبع كلمة واحدة:
System.out.println("packed");
ترجم أولاً:
javac Pack.java
عندما تتطابق الأقواس، يبقى javac صامتاً ويكتب Pack.class. ثم أنشئ jar من ملف الصنف:
jar --create --file Pack.jar Pack.class
شغّل الصنف من jar على classpath:
java -cp Pack.jar Pack
الشاشة تعرض packed. لا تشغّل java Pack من أصناف مفككة في هذا الشكل التعليمي. تطلب من JVM تحميل Pack من Pack.jar.
public class Pack {
public static void main(String[] args) {
System.out.println("packed");
}
}
امشِ المسار مرة. javac Pack.java يبني Pack.class. jar --create --file Pack.jar Pack.class يضع ذلك الصنف داخل Pack.jar. java -cp Pack.jar Pack يبدأ Pack.main. println يكتب packed. لا يعمل @Test. لا يعمل t.name(). لا يعمل stream().map.
قل قاعدة المبتدئ وأنت تنظر إلى المجلد: ترجم المصدر، أنشئ jar من ملف .class، شغّل بـ-cp واسم الصنف العام. لا تختلق فحوص JUnit داخل Pack.java في هذه الصفحة. لا تعتبر jar مترجماً ثانياً — javac ما زال يبني الصنف؛ jar يغلّف فقط.
إذا ما زلت ترى تقرير JUnit أخضر من ملف SumCheck متبقٍ، انتقل إلى Pack وأبقِ طباعة packed. إذا قال jar إنه لا يجد Pack.class، ترجم مرة أخرى قبل إنشاء الأرشيف.
jar مع Main-Class، تشغيل بـ-jar
أبقِ نفس الصنف العام Pack. غيّر الطباعة كي يبقى الشكل التعليمي الثاني سهلاً للتسمية:
System.out.println("shipped");
ترجم مرة أخرى:
javac Pack.java
أنشئ jar يسجّل صنف الدخول:
jar --create --file Pack.jar --main-class Pack Pack.class
شغّل بمشغّل jar:
java -jar Pack.jar
الشاشة تعرض shipped. --main-class Pack يخبر jar أي صنف عام يحمل main. java -jar يقرأ ذلك الدخول ويبدأه. أبقِ طباعة واضحة واحدة لكل شكل تعليمي كي تبقى كلمة الشاشة سهلة التسمية.
public class Pack {
public static void main(String[] args) {
System.out.println("shipped");
}
}
امشِ المسار مرة. javac Pack.java يحدّث Pack.class. jar --create --file Pack.jar --main-class Pack Pack.class يغلّف الصنف ويخزّن اسم الدخول. java -jar Pack.jar يبدأ Pack.main. الشاشة تعرض shipped. أبقِ العرضين كشكلين تعليميين. أولاً أثبت تشغيل -cp يريد packed. ثم أثبت تشغيل -jar يريد shipped. كلا الشكلين يشاركان الصنف العام Pack وعادة jar --create --file.
إذا شغّلت java -jar Pack.jar على jar لم يتلقَّ --main-class، يفشل المشغّل لأن لا صنف دخول مخزّن. ذلك jar الفاشل ليس ملف التعليم الثاني. ملف التعليم الثاني يتضمّن --main-class Pack.
عادات JAR
الإنشاء، تشغيل classpath، Main-Class، وتشغيل -jar تبقى خطوات مبتدئ منفصلة.
📊 JAR habits for Pack
| عادة | شكل | فحص مبتدئ |
|---|---|---|
| إنشاء | jar --create --file Pack.jar Pack.class |
يضع Pack.class داخل Pack.jar |
| تشغيل classpath | java -cp Pack.jar Pack |
الشاشة تعرض packed للعرض الأول |
| Main-Class | jar --create --file Pack.jar --main-class Pack Pack.class |
يخزّن صنف الدخول Pack |
| تشغيل jar | java -jar Pack.jar |
الشاشة تعرض shipped للعرض الثاني |
| ترجم أولاً | javac Pack.java |
حدّث .class قبل إعادة إنشاء jar |
JAR ليس JUnit وليس Records
JUnit علّم الفحوص بـ@Test وقارن القيم المتوقعة. Records حملت مكوّنات مضغوطة تطبعها بوصول. JAR يغلّف ملفات الصنف للإرسال والتشغيل. لا تخلط تلك المهام الثلاث في ملف مبتدئ واحد اليوم.
packed هنا كلمة شاشة العرض الأول من Pack.main داخل تشغيل jar بـ-cp. ليست assertEquals(5, ...) وليست t.name() من record Tag. عندما ملف SumCheck متبقٍ ما زال يتحدث عن متوقع 5، اتركه كتاريخ وأبقِ سطر طباعة Pack.
بدون javac لا يوجد Pack.class جديد للتغليف. بدون jar --create لا يوجد Pack.jar. بدون مسار -cp أو -jar مع Main-Class لم تُظهر أشكال التشغيل في هذا الدرس. أبقِ تعليقات JUnit بعيداً عن هذه الصفحة. أبقِ ترويسات record بعيداً عن هذه الصفحة.
فحص المجلد في آخر صفحة اختيارية
اسرد المجلد بعد إنشاء ناجح. يجب أن ترى Pack.java وPack.class وPack.jar معاً. عدّل المصدر، احفظ، نفّذ javac Pack.java، أعد إنشاء jar بنفس عادة create، ثم شغّل مرة أخرى. jar قديم قد يخفي طباعة متغيّرة إن تخطيت create بعد التعديل.
إذا اشتكى jar من ملف صنف مفقود، ترجم أولاً. إذا java -cp Pack.jar Pack لا يطبع شيئاً، تأكد أن main ما زال يستدعي println. إذا قال java -jar Pack.jar لا يوجد main manifest attribute، أعد الإنشاء بـ--main-class Pack.
لا تلصق @Test من SumCheck داخل Pack. لا تلصق record Tag من Card كبديل للتغليف. مهمة JAR الاختيارية أرشيف لملفات صنف تشغّلها بـ-cp أو -jar.
نهاية المسار الاختياري
يمكنك الإبقاء على الصنف العام Pack، طباعة packed، الترجمة بـjavac Pack.java، إنشاء Pack.jar بـjar --create --file Pack.jar Pack.class، تشغيل java -cp Pack.jar Pack، ثم طباعة shipped، إعادة الإنشاء بـ--main-class Pack، وتشغيل java -jar Pack.jar. الجدول يفصل create وتشغيل classpath وMain-Class وتشغيل jar. هذه آخر صفحة Java اختيارية في خريطة الدورة.
أبقِ عروض Pack لزوج تغليف واضح. أبقِ ملفات JUnit مع SumCheck بعيداً عن هذه الصفحة أثناء تمرين jar. أبقِ ملفات Records مع Card بعيداً عن هذه الصفحة أثناء تمرين jar. أبقِ اختلاق مواضيع اختيارية جديدة بعيداً عن هذه الصفحة — الخريطة تنتهي هنا. تلك العادات نقطة تفتيش المسار الاختياري. عندما يعرض التشغيل الأول packed أو الثاني shipped، أنجز JAR مهمته في هذا الدرس.
مرور أخير على المجلد: Pack عام واحد، .class مطابق، Pack.jar حاضر، أمر create محفوظ، تشغيل -cp أو -jar يطابق العرض الذي تبقيه مفتوحاً، بلا انتظار Scanner، بلا assertion مطلوب. ترجم، أعد إنشاء jar، وشغّل مرة أخرى على العرض المفتوح. إذا ما زالت الشاشة تعرض packed أو shipped، شكل JAR متين والمسار الاختياري Java مكتمل. فضّل عادة تغليف واضحة واحدة لكل قراءة كي يعلّم كل مرور نفس الخريطة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى