טיפ ג'אווה 127: ראה הפעלת JAR

אתה יכול לארוז בקלות את כל מערך השיעורים והמשאבים של יישום בארכיון Java (JAR). למעשה, זו מטרה אחת של קבצי צנצנות. דבר נוסף הוא לאפשר למשתמשים לבצע את היישום המאוחסן בארכיון בקלות. מדוע אם כן קבצי צנצנות אזרחים סוג ב 'ביקום ג'אווה - מתפקדים רק כארכיונים - כאשר הם יכולים להיות מחלקה ראשונה, ממש לצד הפעלות מקומיות?

כדי לבצע קובץ צנצנת, אתה יכול להשתמש ב-

java

פקודות

-jar

אוֹפְּצִיָה. לדוגמה, נניח שיש לך קובץ צנצנת ניתן להריצה בשם

myjar.jar

. מכיוון שהקובץ ניתן להפעלה, אתה יכול לבצע אותו כך:

java -jar myjar.jar

.

לחלופין, סביבת Java Runtime (JRE), כאשר היא מותקנת במערכת הפעלה כמו Microsoft Windows, משייכת קבצי צנצנת ל- JVM כך שתוכל ללחוץ עליהם פעמיים להפעלת היישום. JARs חייבים להיות ניתנים להפעלה.

השאלה היא: איך הופכים את ה- JAR לריצה?

קובץ המניפסט והערך של המחלקה הראשית

בתוך רוב ה- JAR, נקרא קובץ

MANIFEST.MF

מאוחסן בספריה הנקראת

META-INF

. בתוך התיק הזה נקרא ערך מיוחד

Main-Class

אומר ל

java -jar

פקודה איזו מחלקה לבצע.

הבעיה היא שעליך להוסיף כראוי ערך מיוחד זה לקובץ המניפסט בעצמך - עליו להיכנס למקום מסוים וחייב להיות בפורמט מסוים. עם זאת, חלקנו לא אוהבים לערוך קבצי תצורה.

תן ל- API לעשות את זה בשבילך

מאז Java 1.2, חבילה בשם java.util.jarמאפשרת לך לעבוד עם קבצי jar. (הערה: הוא מתבסס על java.util.zipהחבילה.) באופן ספציפי, חבילת הצנצנת מאפשרת לך לתפעל בקלות את קובץ המניפסט המיוחד באמצעות Manifestהמחלקה.

בואו נכתוב תוכנית המשתמשת ב- API זה. ראשית, תוכנית זו חייבת לדעת על שלושה דברים:

  1. את ה- JAR אנו רוצים להפעיל
  2. המעמד הראשי אותו אנו רוצים לבצע (מחלקה זו חייבת להתקיים בתוך ה- JAR)
  3. השם של JAR חדש לפלט שלנו, כי אנחנו לא צריכים פשוט להחליף קבצים

כתוב את התוכנית

הרשימה לעיל תהווה את טיעוני התוכנית שלנו. בשלב זה, בואו לבחור שם מתאים ליישום זה. איך MakeJarRunnableנשמע?

בדוק את הטיעונים העיקריים

נניח שנקודת הכניסה העיקרית שלנו היא main(String[])שיטה סטנדרטית . ראשית עלינו לבדוק כאן את טיעוני התוכנית:

אם (args.length! = 3) {System.out.println ("שימוש: MakeJarRunnable" + ""); System.exit (0); }

אנא שים לב לאופן פירוש רשימת הטיעונים, מכיוון שהיא חשובה לקוד הבא. סדר הטיעון ותכניו אינם נקבעים באבן; עם זאת, זכור לשנות את הקוד האחר כראוי אם תשנה אותו.

גש ל- JAR ולקובץ המניפסט שלו

ראשית, עלינו ליצור כמה אובייקטים שיודעים על JAR וקבצי מניפסט:

// צור את האובייקט JarInputStream, וקבל את JarInputStream jarIn המניפסט שלו = JarInputStream חדש (FileInputStream חדש (args [0])); מניפסט מניפסט = jarIn.getManifest (); אם (מניפסט == null) {// זה יקרה אם אין מניפסט קיים מניפסט = מניפסט חדש (); }

הגדר את התכונה Main-Class

שמנו את Main-Classהערך בסעיף התכונות הראשי של קובץ המניפסט. ברגע שנקבל את קבוצת התכונות הזו מהאובייקט המניפסטי, אנו יכולים להגדיר את המחלקה הראשית המתאימה. עם זאת, מה אם Main-Classתכונה קיימת כבר ב- JAR המקורי? תוכנית זו פשוט מדפיסה אזהרה ויוצאת. אולי נוכל להוסיף טיעון של שורת פקודה שמורה לתוכנית להשתמש בערך החדש במקום בערך הקיים:

תכונות a = manifest.getMainAttributes (); מחרוזת oldMainClass = a.putValue ("מחלקה ראשית", טענות [1]); // אם קיים ערך ישן, ספר למשתמש וצא אם (oldMainClass! = Null) {System.out.println ("אזהרה: הערך הישן של המחלקה הראשית הוא:" + oldMainClass); System.exit (1); }

פלט את ה- JAR החדש

עלינו ליצור קובץ צנצנת חדש, ולכן עלינו להשתמש JarOutputStreamבכיתה. הערה: עלינו לוודא שלא נשתמש באותו קובץ לצורך פלט כמו עבור קלט. לחלופין, אולי התוכנית צריכה לשקול את המקרה בו שני קבצי הצנצנת זהים ולבקש מהמשתמש אם ברצונו להחליף את המקור. עם זאת, אני שומר זאת כתרגיל עבור הקורא. הלאה עם הקוד!

System.out.println ("כותב ל-" + args [2] + "..."); JarOutputStream jarOut = JarOutputStream חדש (FileOutputStream חדש (טענות [2]), מניפסט);

עלינו לכתוב כל ערך מהקלט JAR לפלט ה- JAR, אז חזור על הערכים:

// צור מאגר קריאה להעברת נתונים מבית הקלט [] buf = בתים חדשים [4096]; // מחק את הערכים של JarEntry; בעוד ((entry = jarIn.getNextJarEntry ())! = null) {// אל תכלול את קובץ המניפסט מה- JAR הישן אם ("META-INF / MANIFEST.MF" .equals (entry.getName ())) ממשיך; // כתוב את הערך לפלט JAR jarOut.putNextEntry (ערך); לקרוא int; בעוד ((read = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, read); } jarOut.closeEntry (); } // שטוף וסגור את כל הזרמים jarOut.flush (); jarOut.close (); jarIn.close ();

תוכנית שלמה

כמובן שעלינו למקם את הקוד הזה mainבשיטה, בתוך מחלקה ועם קבוצה מתאימה של הצהרות ייבוא. סעיף משאבים מספק את התוכנית המלאה.

דוגמא לשימוש

בואו נשתמש בתוכנית זו לדוגמא. נניח שיש לך יישום שנקודת הכניסה העיקרית שלו היא בכיתה שנקראת HelloRunnableWorld. (זהו השם המלא של הכיתה.) כמו כן, נניח שיצרת JAR בשם myjar.jarהמכיל את היישום כולו. הפעל MakeJarRunnableעל קובץ הצנצנת הזה כך:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

שוב, כאמור קודם, שים לב כיצד אני מזמין את רשימת הטיעונים. אם אתה שוכח את ההזמנה, פשוט הפעל את התוכנית ללא שום ויכוחים והיא תגיב בהודעת שימוש.

נסה להפעיל את

java -jar

פקודה מופעלת

myjar.jar

ואז הלאה

myjar_r.jar

. Note the difference! After you've done that, explore the manifest files (

META-INF/MANIFEST.MF

) in each JAR. (You can find both JARs in the

source code

.)

Here's a suggestion: Try to make the MakeJarRunnable program into a runnable JAR!

Run with it

Running a JAR by double-clicking it or using a simple command is always more convenient than having to include it in your classpath and running a specific main class. To help you do this, the JAR specification provides a Main-Class attribute for the JAR's manifest file. The program I present here lets you utilize Java's JAR API to easily manipulate this attribute and make your JARs runnable.

שון סילברמן הוא כיום סטודנט לתואר שני במחלקה להנדסת חשמל ומחשבים באוניברסיטת מניטובה בקנדה. הוא החל לעבוד עם ג'אווה באמצע שנת 1996 ומאז השתמש בה כמעט באופן בלעדי. תחומי העניין הנוכחיים שלו כוללים סימולציה של שדות ונוזלים חשמליים, קודים לתיקון שגיאות והטמעה של טריקים GUI (ממשק משתמש גרפי) נחמד. שון מעביר גם קורס עיצוב תוכנה בשנה ג 'במחלקה להנדסת מחשבים באוניברסיטה שלו.

למידע נוסף על נושא זה

  • הורד את קוד המקור ואת ה- JAR עבור טיפ זה

    //images.techhive.com/downloads/idge/imported/article/jvw/2002/05/makejarrunnable.zip

  • "ג'אווה טיפ 120 בצע ג'ארים המוציאים את עצמם", ז 'סטיב ג'ין וג'ון ד' מיטשל ( JavaWorld, נובמבר 2001)

    //www.javaworld.com/javaworld/javatips/jw-javatip120.html

  • JAR File Specification

    //java.sun.com/j2se/1.3/docs/guide/jar/jar.html

  • jar—The Java Archive Tool

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Browse the Core Java section of JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-core-index.shtml

  • הישאר בראש הטריקים של טיפים על ידי מנוי לניוזלטרים השבועיים בחינם של JavaWorld

    //www.javaworld.com/subscribe

  • למד את היסודות של Java בצד הלקוח ב "JavaWorld ים למתחילים Java הדיון. נושאי הליבה כוללים את שפת Java, Java Virtual Machine, APIs וכלי פיתוח

    //forums.idg.net/[email protected]@.ee6b804

  • תוכלו למצוא שפע של מאמרים הקשורים ל- IT מפרסומי אחותנו באתר .net

סיפור זה, "Java Tip 127: See JAR run" פורסם במקור על ידי JavaWorld.