Προγραμματισμός

Συμβουλή Java 127: Δείτε την εκτέλεση JAR

Μπορείτε εύκολα να συσκευάσετε ολόκληρο το σύνολο των τάξεων και των πόρων μιας εφαρμογής σε ένα αρχείο Java (JAR). Στην πραγματικότητα, αυτός είναι ένας στόχος να έχετε αρχεία βάζων. Ένα άλλο είναι να επιτρέπεται στους χρήστες να εκτελούν εύκολα την εφαρμογή που είναι αποθηκευμένη στο αρχείο. Γιατί λοιπόν τα αρχεία βάζων πολίτες δεύτερης κατηγορίας στο σύμπαν της Java - λειτουργούν μόνο ως αρχεία - όταν μπορούν να είναι πρώτης τάξεως, ακριβώς δίπλα σε εγγενή εκτελέσιμα;

Για να εκτελέσετε ένα αρχείο βάζου, μπορείτε να χρησιμοποιήσετε το

Ιάβα

εντολή

-δοχείο

επιλογή. Για παράδειγμα, ας πούμε ότι έχετε ένα τρέξιμο αρχείο βάζου που ονομάζεται

myjar.jar

. Επειδή το αρχείο μπορεί να εκτελεστεί, μπορείτε να το εκτελέσετε ως εξής:

java -jar myjar.jar

.

Εναλλακτικά, το Java Runtime Environment (JRE), όταν εγκαθίσταται σε λειτουργικό σύστημα όπως τα Microsoft Windows, συσχετίζει αρχεία βάζων με το JVM, ώστε να μπορείτε να κάνετε διπλό κλικ σε αυτά για να εκτελέσετε την εφαρμογή. Αυτά τα JAR πρέπει να μπορούν να εκτελεστούν.

Η ερώτηση είναι: Πώς μπορείτε να κάνετε ένα JAR τρέξιμο;

Το αρχείο δήλωσης και η καταχώριση Main-Class

Μέσα στα περισσότερα JAR, ένα αρχείο που ονομάζεται

MANIFEST.MF

αποθηκεύεται σε έναν κατάλογο που ονομάζεται

ΜΕΤΑ-ΙΝΦ

. Μέσα σε αυτό το αρχείο, κάλεσε μια ειδική καταχώριση

Κύρια τάξη

λέει στο

java -jar

εντολή ποιας κλάσης θα εκτελεστεί.

Το πρόβλημα είναι ότι πρέπει να προσθέσετε σωστά αυτήν την ειδική καταχώριση στο αρχείο δήλωσης μόνοι σας - πρέπει να πάει σε ένα συγκεκριμένο μέρος και πρέπει να έχει μια συγκεκριμένη μορφή. Ωστόσο, ορισμένοι από εμάς δεν τους αρέσει η επεξεργασία αρχείων διαμόρφωσης.

Αφήστε το API να το κάνει για εσάς

Από την Java 1.2, ονομάστηκε ένα πακέτο java.util.jar σας έχει επιτρέψει να εργαστείτε με αρχεία βάζων. (Σημείωση: Βασίζεται στο java.util.zip πακέτο.) Συγκεκριμένα, το πακέτο βάζων σάς επιτρέπει να χειρίζεστε εύκολα αυτό το ειδικό αρχείο δήλωσης μέσω του Δηλωτικό τάξη.

Ας γράψουμε ένα πρόγραμμα που χρησιμοποιεί αυτό το API. Πρώτον, αυτό το πρόγραμμα πρέπει να γνωρίζει τρία πράγματα:

  1. Το JAR που θέλουμε να κάνουμε runnable
  2. Η κύρια τάξη που θέλουμε να εκτελέσουμε (αυτή η τάξη πρέπει να υπάρχει μέσα στο JAR)
  3. Το όνομα ενός νέου JAR για την έξοδο μας, γιατί δεν πρέπει απλώς να αντικαταστήσουμε αρχεία

Γράψτε το πρόγραμμα

Η παραπάνω λίστα θα αποτελέσει τα επιχειρήματα του προγράμματός μας. Σε αυτό το σημείο, ας επιλέξουμε ένα κατάλληλο όνομα για αυτήν την εφαρμογή. Πώς κάνει MakeJarRunnable ήχος?

Ελέγξτε τα ορίσματα στο κύριο

Ας υποθέσουμε ότι το κύριο σημείο εισόδου μας είναι ένα πρότυπο κύρια (συμβολοσειρά []) μέθοδος. Πρέπει πρώτα να ελέγξουμε τα επιχειρήματα του προγράμματος εδώ:

 if (args.length! = 3) {System.out.println ("Χρήση: MakeJarRunnable" + ""); System.exit (0); } 

Δώστε προσοχή στον τρόπο ερμηνείας της λίστας ορισμάτων, καθώς είναι σημαντικό για τον ακόλουθο κώδικα. Η σειρά των επιχειρημάτων και τα περιεχόμενα δεν είναι λιτή. Ωστόσο, θυμηθείτε να τροποποιήσετε κατάλληλα τον άλλο κώδικα εάν τους αλλάξετε.

Αποκτήστε πρόσβαση στο JAR και στο αρχείο δήλωσης

Πρώτον, πρέπει να δημιουργήσουμε κάποια αντικείμενα που γνωρίζουν το JAR και τα αρχεία μανιφέστο:

 // Δημιουργήστε το αντικείμενο JarInputStream και αποκτήστε το μανιφέστο JarInputStream jarIn = new JarInputStream (νέο FileInputStream (args [0])); Manifest manifest = jarIn.getManifest (); if (manifest == null) {// Αυτό θα συμβεί εάν δεν υπάρχει μανιφέστο manifest = new Manifest (); } 

Ορίστε το χαρακτηριστικό Main-Class

Βάζουμε το Κύρια τάξη καταχώριση στην κύρια ενότητα χαρακτηριστικών του αρχείου δήλωσης. Μόλις λάβουμε αυτό το σύνολο χαρακτηριστικών από το αντικείμενο δήλωσης, μπορούμε να ορίσουμε την κατάλληλη κύρια κλάση. Ωστόσο, τι γίνεται αν Κύρια τάξη υπάρχει ήδη το χαρακτηριστικό στο αρχικό JAR; Αυτό το πρόγραμμα εκτυπώνει απλά μια προειδοποίηση και βγαίνει. Ίσως θα μπορούσαμε να προσθέσουμε ένα όρισμα γραμμής εντολών που λέει στο πρόγραμμα να χρησιμοποιεί τη νέα τιμή αντί της προϋπάρχουσας:

 Χαρακτηριστικά a = manifest.getMainAttributes (); String oldMainClass = a.putValue ("Main-Class", args [1]); // Εάν υπάρχει μια παλιά τιμή, πείτε στον χρήστη και πραγματοποιήστε έξοδο εάν (oldMainClass! = Null) {System.out.println ("Προειδοποίηση: παλιά τιμή Main-Class είναι:" + oldMainClass); System.exit (1); } 

Έξοδος του νέου JAR

Πρέπει να δημιουργήσουμε ένα νέο αρχείο βάζου, οπότε πρέπει να χρησιμοποιήσουμε το JarOutputStream τάξη. Σημείωση: Πρέπει να διασφαλίσουμε ότι δεν χρησιμοποιούμε το ίδιο αρχείο για έξοδο όπως και για την εισαγωγή. Εναλλακτικά, ίσως το πρόγραμμα θα πρέπει να εξετάσει την περίπτωση όπου τα δύο αρχεία βάζων είναι τα ίδια και να ζητήσει από τον χρήστη εάν επιθυμεί να αντικαταστήσει το πρωτότυπο. Ωστόσο, το διατηρώ ως άσκηση για τον αναγνώστη. Ενεργοποιήστε τον κωδικό!

 System.out.println ("Γράφοντας σε" + args [2] + "..."); JarOutputStream jarOut = νέο JarOutputStream (νέο FileOutputStream (args [2]), μανιφέστο); 

Πρέπει να γράψουμε κάθε καταχώριση από την είσοδο JAR στην έξοδο JAR, ώστε να επαναλάβετε τις καταχωρίσεις:

 // Δημιουργήστε ένα buffer ανάγνωσης για μεταφορά δεδομένων από το byte εισαγωγής [] buf = νέο byte [4096]; // Επαναλάβετε τις καταχωρήσεις JarEntry? ενώ ((είσοδος = 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 (); 

Πλήρες πρόγραμμα

Φυσικά, πρέπει να τοποθετήσουμε αυτόν τον κωδικό μέσα σε ένα κύριος μέθοδο, μέσα σε μια τάξη και με ένα κατάλληλο σύνολο δηλώσεων εισαγωγής. Η ενότητα Πόροι παρέχει το πλήρες πρόγραμμα.

Παράδειγμα χρήσης

Ας χρησιμοποιήσουμε αυτό το πρόγραμμα με ένα παράδειγμα. Ας υποθέσουμε ότι έχετε μια εφαρμογή της οποίας το κύριο σημείο εισόδου είναι σε μια κλάση που ονομάζεται Γεια σαςRunnableWorld. (Αυτό είναι το πλήρες όνομα της τάξης.) Υποθέστε επίσης ότι έχετε δημιουργήσει ένα JAR που ονομάζεται myjar.jar, που περιέχει ολόκληρη την εφαρμογή. Τρέξιμο MakeJarRunnable σε αυτό το αρχείο βάζου έτσι:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Και πάλι, όπως αναφέρθηκε προηγουμένως, παρατηρήστε πώς παραγγέλνω τη λίστα επιχειρημάτων. Εάν ξεχάσετε την παραγγελία, απλώς εκτελέστε αυτό το πρόγραμμα χωρίς ορίσματα και θα απαντήσει με ένα μήνυμα χρήσης.

Προσπαθήστε να εκτελέσετε το

java -jar

εντολή

myjar.jar

και μετά

myjar_r.jar

. Σημειώστε τη διαφορά! Αφού το κάνετε αυτό, εξερευνήστε τα αρχεία δήλωσης (

META-INF / MANIFEST.MF

) σε κάθε JAR. (Μπορείτε να βρείτε και τα δύο JAR στο

πηγαίος κώδικας

.)

Ακολουθεί μια πρόταση: Προσπαθήστε να κάνετε το MakeJarRunnable πρόγραμμα σε ένα τρέξιμο JAR!

Τρέξτε με αυτό

Η εκτέλεση ενός JAR κάνοντας διπλό κλικ σε αυτό ή χρησιμοποιώντας μια απλή εντολή είναι πάντα πιο βολικό από το να πρέπει να το συμπεριλάβετε στο classpath και να εκτελείτε μια συγκεκριμένη κύρια τάξη. Για να σας βοηθήσουμε να το κάνετε αυτό, η προδιαγραφή JAR παρέχει ένα Κύρια τάξη χαρακτηριστικό για το αρχείο δήλωσης του JAR. Το πρόγραμμα που παρουσιάζω εδώ σας επιτρέπει να χρησιμοποιήσετε το Java JAR API για να χειριστείτε εύκολα αυτό το χαρακτηριστικό και να κάνετε τα JAR σας να εκτελούνται.

Ο Shawn Silverman είναι σήμερα μεταπτυχιακός φοιτητής στο τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών στο Πανεπιστήμιο της Μανιτόμπα στον Καναδά. Ξεκίνησε να εργάζεται με την Java στα μέσα του 1996 και έκτοτε το χρησιμοποίησε σχεδόν αποκλειστικά. Τα τρέχοντα ενδιαφέροντά του περιλαμβάνουν την προσομοίωση ηλεκτρικών πεδίων και ρευστών, κωδικούς διόρθωσης σφαλμάτων και την εφαρμογή τέλειων κόλπων GUI (γραφική διεπαφή χρήστη). Ο Shawn διδάσκει επίσης ένα τρίμηνο μάθημα σχεδιασμού λογισμικού στο τμήμα μηχανικής υπολογιστών στο πανεπιστήμιο του.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Κατεβάστε τον πηγαίο κώδικα και τα JAR για αυτήν την συμβουλή

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

  • "Java Tip 120Execute Self-Extracting JARs," Z. Steve Jin and John D. Mitchell (JavaWorld, Νοέμβριος 2001)

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

  • Προδιαγραφή αρχείου JAR

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

  • βάζο - Το εργαλείο αρχειοθέτησης Java

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

  • Δείτε όλα τα προηγούμενα Συμβουλές Java και υποβάλετε το δικό σας

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

  • Μάθετε Java από την αρχή προς τα πάνω JavaWorld 'μικρό Java 101 στήλη

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

  • Οι ειδικοί της Java απαντούν στις πιο δύσκολες ερωτήσεις σας στο Java JavaWorld 'μικρό Ε & Α Java στήλη

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

  • Περιηγηθείτε στο Πυρήνας Java τμήμα του JavaWorld 'Τοπ Ευρετήριο

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

  • Παραμείνετε στην κορυφή μας Συμβουλές και κόλπα εγγραφείτε στο JavaWorld 'δωρεάν εβδομαδιαία ενημερωτικά δελτία email

    //www.javaworld.com/subscribe

  • Μάθετε τα βασικά του Java από την πλευρά του πελάτη JavaWorld 'μικρό Αρχάριος Java συζήτηση. Τα βασικά θέματα περιλαμβάνουν τη γλώσσα Java, την εικονική μηχανή Java, τα API και τα εργαλεία ανάπτυξης

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

  • Θα βρείτε πληθώρα άρθρων που σχετίζονται με την πληροφορική από τις αδελφές εκδόσεις μας στο .net

Αυτή η ιστορία, "Java Tip 127: See JAR run" δημοσιεύθηκε αρχικά από το JavaWorld.