JAR در Java
فایلهای کلاس ترجمهشده را داخل یک jar بستهبندی کنید تا بتوانید آنها را بهصورت یک فایل بفرستید و اجرا کنید. در Pack.java کلاس عمومی Pack را نگه دارید، از main مقدار packed را چاپ کنید، با javac Pack.java ترجمه کنید، بعد با jar --create --file Pack.jar Pack.class فایل Pack.jar را بسازید. با java -cp Pack.jar Pack اجرا کنید تا صفحه packed را نشان دهد. دموی دوم shipped چاپ میکند و از jarی استفاده میکند که Main-Class را نام میبرد تا java -jar Pack.jar کار کند. این درس بستهبندی jar است، نه چک @Test در JUnit و نه چاپ accessor در 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 و نام کلاس عمومی اجرا کنید. روی این صفحه داخل Pack.java چک JUnit نسازید. jar را مترجم دوم فرض نکنید — هنوز javac کلاس را میسازد؛ jar فقط بستهبندی میکند.
اگر هنوز از فایل باقیماندهٔ SumCheck گزارش سبز JUnit میبینید، به 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
با launcher مربوط به 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 نگرفته، launcher شکست میخورد چون کلاس ورود ذخیره نشده. آن 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 |
قبل از ساخت دوبارهٔ jar فایل .class را تازه کنید |
JAR نه JUnit است و نه Records
JUnit چکها را با @Test علامت میزد و مقادیر مورد انتظار را مقایسه میکرد. Records اجزای فشردهای داشت که با accessor چاپ میکردید. 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 شکلهای اجرای این درس را نشان ندادهاید. annotationهای 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 ترجمه کنید، با jar --create --file Pack.jar Pack.class فایل Pack.jar را بسازید، java -cp Pack.jar Pack را اجرا کنید، بعد shipped چاپ کنید، با --main-class Pack دوباره بسازید، و java -jar Pack.jar را اجرا کنید. جدول ساخت، اجرای classpath، Main-Class و اجرای jar را از هم جدا میکند. این آخرین صفحهٔ اختیاری Java در نقشهٔ دوره است.
دموهای Pack را برای جفت روشن بستهبندی نگه دارید. فایلهای JUnit با SumCheck را هنگام تمرین jar از این صفحه دور نگه دارید. فایلهای Card در Records را هنگام تمرین jar از این صفحه دور نگه دارید. اختراع موضوع اختیاری تازه را از این صفحه دور نگه دارید — نقشه اینجا تمام میشود. این عادتها نقطهٔ عبور مسیر اختیاریاند. وقتی اجرای اول packed یا اجرای دوم shipped را نشان میدهد، JAR کار این درس را کرده است.
یک نوبت آخر روی پوشه: یک Pack عمومی، .class منطبق، Pack.jar حاضر، دستور create یادتان باشد، اجرای -cp یا -jar با دمویی که باز نگه داشتهاید جور باشد، بدون انتظار Scanner، بدون نیاز به assertion. یکبار دیگر ترجمه کنید، jar را دوباره بسازید، و روی دمویی که باز نگه داشتهاید اجرا کنید. اگر صفحه هنوز packed یا shipped را نشان میدهد، شکل JAR محکم است و مسیر اختیاری Java کامل است. برای هر خواندن یک عادت بستهبندی روشن نگه دارید تا هر بار همان نقشه را یاد بگیرید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود