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

Συμβουλή Java 120: Εκτελέστε αυτοαποσυμπιεσμένα JAR

Για πολλά χρόνια, η δημιουργία αρχείων του Phil Katz, zip, ήταν μια από τις πιο δημοφιλείς μορφές αρχειοθέτησης αρχείων. Η Sun έχει υιοθετήσει τη μορφή zip ως βάση για το Java Archive (JAR). Η Sun έχει επεκτείνει τη χρήση της μορφής zip με διάφορες συμβάσεις, ώστε να μπορείτε να συσκευάσετε τάξεις Java σε ένα αρχείο αρχειοθέτησης. Με την προσθήκη του JAR δηλωτικό αρχείο, ο χρόνος εκτέλεσης Java μπορεί εύκολα να εντοπίσει και να εκτελέσει απευθείας την κύρια κλάση της εφαρμογής Java που περιέχεται στο αρχείο βάζου.

Μερικοί φερμουάρ βοηθητικά εργαλεία μπορούν να δημιουργήσουν αυτο-εξαγωγή αρχεία για διάφορες πλατφόρμες, όπως MS Windows. Το βοηθητικό εργαλείο συνδυάζει ένα κανονικό αρχείο zip με ένα πρόγραμμα εξαγωγής για τη δημιουργία ενός νέου εκτελέσιμου (exe) αρχείου. Οι δέκτες του αρχείου exe πρέπει να το εκτελέσουν μόνο για να εξαγάγουν τα περιεχόμενα του αρχικού αρχείου zip. Το εκτελέσιμο εκτελεί το πρόγραμμα εξαγωγής για να εξαγάγει τα αρχειοθετημένα αρχεία σε έναν κατάλογο εξόδου που καθορίζεται από το χρήστη.

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

Η δημιουργία του αυτόματου εξαγόμενου αρχείου βάζου είναι απλή. Χρειάζεστε απλώς ένα ειδικό αρχείο δήλωσης JAR, ένα πρόγραμμα εξαγωγής που βασίζεται σε Java, το αρχείο zip ή jar που περιέχει τα βασικά αρχεία περιεχομένου και τυχόν Java SDK δοχείο εφαρμογή χρησιμότητας.

Το αρχείο δήλωσης

Για να δημιουργήσετε εκτελέσιμα JAR, πρέπει πρώτα να ονομάσετε ένα αρχείο δήλωσης MANIFEST.MF στο ΜΕΤΑ-ΙΝΦ Ευρετήριο. Το αρχείο δήλωσης μπορεί να περιέχει έναν αριθμό πιθανών καταχωρήσεων. Ωστόσο, για τους σκοπούς μας εδώ, απλώς πρέπει να καθορίσουμε το όνομα της κλάσης Java που περιέχει το πρόγραμμα εξαγωγής που βασίζεται σε Java κύριος() μέθοδος:

Κύρια τάξη: ZipSelfExtractor 

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

Ο εξολκέας

Μπορείτε να κάνετε το πρόγραμμα εξαγωγής χρησιμοποιώντας διάφορες προσεγγίσεις. Η προσέγγιση που παρουσιάζουμε εδώ είναι απλή και απλή. Κατ 'αρχάς, το πρόγραμμα εξαγωγής καταγράφει το όνομα του αρχείου βάζου που εξάγει. Με αυτό το όνομα στο χέρι, ο εξολκέας χρησιμοποιεί τις τυπικές, ενσωματωμένες βιβλιοθήκες Java zip / jar για να εξαγάγει τα αρχεία περιεχομένου από το αρχείο. Μπορείτε να βρείτε τον πλήρη πηγαίο κώδικα για ZipSelfExtractor σε ZipSelfExtractor.java.

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

 ιδιωτική συμβολοσειρά getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Συμβολοσειρά urlStr = urlJar.toString (); int from = "jar: file:". length (); int to = urlStr.indexOf ("! /"); επιστροφή urlStr.substring (από, σε); } 

Παρατηρήστε ότι στο getSystemResource () μέθοδο που περνάμε myClassName αντί ZipSelfExtractor.class. Αυτό μας επιτρέπει να αλλάξουμε το όνομα του προγράμματος εξαγωγής χωρίς να αλλάξουμε αυτό το μέρος του κώδικα. Ορίσαμε myClassName αναζητώντας το όνομα της τρέχουσας τάξης.

Στη συνέχεια, εξάγουμε το όνομα του αρχείου βάζου. Αρχικά, ζητάμε μια διεύθυνση URL για το αρχείο κλάσης που περιέχει την τρέχουσα τάξη (που είναι το πρόγραμμα εξαγωγής). Μόλις αποκτήσουμε τη διεύθυνση URL, μπορούμε να αποσπάσουμε το όνομα του αρχείου βάζου. Εξ ορισμού, η διεύθυνση URL του προγράμματος εξαγωγής JAR ακολουθεί τη βασική μορφή:

  1. δοχείο:, το οποίο δείχνει ότι το εκτελέσιμο εκτελείται από μέσα σε ένα αρχείο βάζου
  2. Η διεύθυνση URL του αρχείου βάζου, όπως αρχείο: / C: /temp/test.jar, ακολουθούμενο από το ! χαρακτήρας
  3. Το όνομα της εσωτερικής διαδρομής του αρχείου στο JAR, όπως /ZipSelfExtractor.class

Στην περίπτωση του προγράμματος εξαγωγής, η διεύθυνση URL μπορεί να μοιάζει με:

βάζο: αρχείο: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Τώρα που έχουμε το όνομα του αρχείου βάζου, μπορούμε να πραγματοποιήσουμε την εξαγωγή. Τα κενά του προγράμματος εξαγωγής βασίζονται στις ενσωματωμένες βιβλιοθήκες χειρισμού αρχείων zip / jar για να αποσυμπιέσουν τα αρχεία περιεχομένου που περιέχονται στο αρχείο. Δείτε πόρους για περισσότερες πληροφορίες σχετικά με τις βιβλιοθήκες χειρισμού αρχείων zip / jar.

Για ευκολία στη χρήση, ο απορροφητήρας είναι μια γραφική εφαρμογή Java. Η εφαρμογή χρησιμοποιεί το JFileChooser τάξη για να επιτρέψει στους χρήστες να καθορίσουν τον κατάλογο προορισμού στον οποίο θέλουν να εξαχθούν τα αρχεία. ΕΝΑ ProgressMonitor δείχνει την πρόοδο της διαδικασίας εξαγωγής. Εάν ένα αρχείο ενδέχεται να αντικαταστήσει ένα ήδη υπάρχον αρχείο, θα ερωτηθεί ο χρήστης εάν θα αντικαταστήσει το υπάρχον αρχείο ή όχι. Στο συμπέρασμα, ένα τυπικό παράθυρο διαλόγου παρουσιάζει στατιστικά στοιχεία εξαγωγής.

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

Συσκευασία του αρχείου βάζου

Τώρα που έχουμε το αρχείο δήλωσης και το πρόγραμμα εξαγωγής, μπορούμε να δημιουργήσουμε το αρχείο βάζου αυτο-εξαγωγής. Μπορούμε να χρησιμοποιήσουμε χειροκίνητα τα JDK δοχείο βοηθητικό πρόγραμμα για να δημιουργήσετε ένα αυτο-εξαγόμενο αρχείο βάζου. Για παράδειγμα, υποθέτοντας ότι έχετε ένα αρχείο zip που ονομάζεται myzip.zip, μπορείτε να εκτελέσετε τα ακόλουθα βήματα για να δημιουργήσετε ένα αρχείο αυτόματης εξαγωγής από αυτό:

  1. CD στον κατάλογο που περιέχει myzip.zip
  2. Κατεβάστε zipper.jar
  3. Εξαγάγετε τα αρχεία στον τρέχοντα κατάλογο. Το έχουμε κάνει αυτό-εξαγόμενο JAR:
    java -jar zipper.jar 
  4. Αντιγράψτε το zipper.class αρχείο στο ZipSelfExtractor.class
  5. Μετονομάζω myzip.zip όπως και myzip.jar
  6. Εκσυγχρονίζω myzip.jar με την βιτρίνα και ZipSelfExtractor.class αρχεία:
    βάζο uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Τώρα myzip.jar είναι αυτο-εξαγωγή σε όλες τις πλατφόρμες που περιέχουν Java Runtime Environment (JRE) 1.2 ή μεταγενέστερη έκδοση. Για να εκτελέσετε το αρχείο αυτόματης εξαγωγής βάζου, εκτελέστε:

java -jar myzip.jar 

Σημειώστε ότι ορισμένες πλατφόρμες ενδέχεται να έχουν ήδη ρυθμίσει δεσμεύσεις έτσι ώστε να μπορείτε να εκτελέσετε το αρχείο βάζου κάνοντας κλικ στο myzip.jar εικονίδιο αρχείου, το οποίο θα εκτελεί το αντίστοιχο της γραμμής εντολών.

Άσκηση για τον αναγνώστη

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

Απελευθερώστε το χέρι σας από το βάζο

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

Αντί να δημιουργήσετε με μη αυτόματο τρόπο το αρχείο αυτόματης εξαγωγής βάζου, ελέγξτε το ZipAnywhere. Το ZipAnywhere είναι ένα πλήρες χαρακτηριστικό φερμουάρ/δοχείο βοηθητικό εργαλείο γραμμένο σε 100% καθαρή Java. Είναι ένα δωρεάν εργαλείο που βασίζεται σε GUI a la WinZip και μπορεί να δημιουργήσει αυτο-εξαγόμενα αρχεία βάζων με το πάτημα ενός κουμπιού.

Ο Δρ Zunhe Steve Jin είναι μηχανικός λογισμικού προσωπικού στο Rational Software και συγγραφέας του ZipAnywhere. Ο John D. Mitchell είναι ο συνεισφέρων συντάκτης της στήλης JavaWorld Tips 'N Tricks. Ο John είναι επίσης ο ιδρυτής και επικεφαλής αρχιτέκτονας της Non, Inc., μιας συμβουλευτικής πρακτικής Τεχνολογικής Διαχείρισης Κινδύνων Επιχειρήσεων

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

  • Κατεβάστε τα αρχεία προέλευσης για αυτήν τη συμβουλή

    //www.javaworld.com/javaworld/javatips/javatip120/zipper.jar

  • "Συμβουλή Java 49 Πώς να εξαγάγετε πόρους Java από τα αρχεία JAR και Zip," John D. Mitchell και Arthur Choi (JavaWorld)

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

  • "Java Tip 70Create Objects from Jar Files!" Τζον Δ. Μίτσελ (JavaWorld)

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

  • Προδιαγραφή αρχείου βάζου

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

  • Οδηγός γραμμής εντολών JAR

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

  • ZipAnywhere, εργαλείο αυτόματης εξαγωγής JAR με βάση το GUI

    //www.geocities.com/zipanywhere

  • Δείτε όλα τα προηγούμενα Συμβουλές 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

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

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

  • Μιλήστε στο φόρουμ Java

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

  • Εγγραφείτε JavaWorld 'δωρεάν εβδομαδιαία ενημερωτικά δελτία email

    //www.idg.net/jw-subscribe

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

Αυτή η ιστορία, "Java Tip 120: Execute self-extracting JARs" δημοσιεύθηκε αρχικά από το JavaWorld.