Petua Java 120: Jalankan pengekstrakan sendiri JAR

Selama bertahun-tahun, ciptaan arkib Phil Katz, zip, telah menjadi salah satu format pengarkiban fail yang paling popular. Sun telah menggunakan format zip sebagai dasar untuk Java Archive (JAR). Sun telah memperluas penggunaan format zip dengan pelbagai konvensi sehingga anda dapat mengemas kelas Java ke dalam fail arkib. Dengan penambahan file manifes JAR , runtime Java dapat dengan mudah mencari dan melaksanakan secara langsung kelas utama aplikasi Java yang terdapat dalam file jar.

Beberapa zipalat utiliti dapat membuat arkib pengambilan sendiri untuk pelbagai platform, seperti MS Windows. Alat utiliti menggabungkan arkib zip biasa dengan program pengekstrak untuk menghasilkan fail yang boleh dilaksanakan (exe) baru. Penerima fail exe hanya perlu menjalankannya untuk mengekstrak kandungan arkib zip asal. Yang dapat dijalankan menjalankan program pengekstrak untuk mengekstrak fail yang diarkibkan ke dalam direktori output yang ditentukan pengguna.

Anda boleh menukar zip zip atau fail jar ke dalam fail jar yang dapat dilaksanakan di mana-mana platform Java. Walaupun zip pengekstrakan diri hanya dapat membuat eksibel khusus platform, fail balang pengekstrak diri dapat diedarkan ke dan dijalankan di platform mana pun yang mendukung Java.

Membuat fail balang yang diekstrak sendiri adalah mudah. Anda hanya memerlukan fail manifes JAR khas, program pengekstrakan berbasis Java, fail zip atau balang yang mengandungi fail kandungan asas, dan jaraplikasi utiliti Java SDK mana pun .

Fail manifes

Untuk membuat JAR yang dapat dilaksanakan, pertama-tama anda memerlukan fail manifes yang disebut MANIFEST.MFdalam META-INFdirektori. Fail manifes mungkin mengandungi sebilangan kemungkinan entri; namun, untuk tujuan kami di sini, kami hanya perlu menentukan nama kelas Java yang mengandungi main()kaedah program pengekstrak berbasis Java :

Kelas Utama: ZipSelfExtractor 

Kami telah menambahkan fail manifes yang dinamakan jarmanifestpada kod contoh tip ini. Untuk maklumat lebih lanjut mengenai fail manifes, lihat Spesifikasi Fail Jar.

Pengekstrak

Anda boleh membuat program pengekstrak menggunakan pelbagai pendekatan. Pendekatan yang kami sampaikan di sini adalah mudah dan mudah. Pertama, program pengekstrakan mengetahui nama fail balang yang diambil sendiri. Dengan nama itu, pengekstrak menggunakan pustaka zip / balang Java bawaan standard untuk mengekstrak fail kandungan dari arkib. Anda boleh mendapatkan kod sumber lengkap untuk ZipSelfExtractordi ZipSelfExtractor.java.

Mendapatkan nama fail balang dalam program pengekstrak boleh menjadi sukar. Walaupun nama fail jar muncul di baris perintah, nama itu tidak diteruskan ke kaedah kelas main(). Oleh itu, dalam program pengekstrak, kami menggunakan kod berikut untuk mengekstrak maklumat dari URL yang menunjuk ke pengekstrak:

String peribadi getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Rentetan urlStr = urlJar.toString (); int dari = "jar: file:". length (); int ke = urlStr.indexOf ("! /"); mengembalikan urlStr.substring (dari, ke); }

Perhatikan bahawa dalam getSystemResource()kaedah yang kita lalui myClassNamebukan ZipSelfExtractor.class. Itu membolehkan kita menukar nama program pengekstrak tanpa mengubah bahagian kod tersebut. Kami menetapkan myClassNamedengan mencari nama kelas semasa.

Seterusnya, kami mengekstrak nama fail balang. Pertama, kami meminta URL ke fail kelas yang mengandungi kelas yang sedang berjalan (yang merupakan program pengekstrak). Setelah kami mempunyai URL, kami dapat memasukkan nama fail balang. Secara definisi, URL program pengekstrak JAR mengikuti format asas:

  1. jar:, yang menunjukkan bahawa yang boleh dijalankan berjalan dari dalam fail balang
  2. URL fail jar, seperti file:/C:/temp/test.jar, diikuti oleh !watak
  3. Nama jalan dalaman fail dalam JAR, seperti /ZipSelfExtractor.class

Dalam kes program pengekstrak, URL mungkin kelihatan seperti:

balang: fail: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Sekarang kita mempunyai nama fail jar, kita dapat melakukan pengekstrakan. Usaha program pengekstrakan bergantung pada perpustakaan manipulasi fail zip / jar Java bawaan untuk mengeluarkan fail kandungan yang terdapat dalam arkib. Lihat Sumber untuk maklumat lanjut mengenai perpustakaan manipulasi fail zip / balang.

Untuk kemudahan penggunaan, pengekstrak adalah aplikasi Java grafik. Aplikasi ini menggunakan JFileChooserkelas untuk membiarkan pengguna menentukan direktori tujuan yang mereka inginkan fail yang diekstrak. A ProgressMonitormenunjukkan kemajuan proses pengekstrakan. Sekiranya fail mungkin menimpa fail yang sudah ada, pengguna akan ditanya apakah akan menimpa fail yang ada atau tidak. Sebagai kesimpulan, kotak dialog standard menyajikan statistik pengekstrakan.

Akhirnya, program pengekstrak memeriksa bahawa ia tidak mengekstrak fail yang membuat fail jar mengekstrak sendiri - fail manifes dan fail pengekstrak .class; program haruslah mengekstrak kandungan JAR yang asal. Kedua-dua fail tersebut adalah artifak dari fail balang yang diekstrak sendiri dan bukan sebahagian daripada fail kandungan asas yang asal.

Mengemas fail balang

Sekarang kita mempunyai fail manifes dan program pengekstrak, kita dapat membina fail balang yang diekstrak sendiri. Kita boleh menggunakan jarutiliti JDK secara manual untuk membuat fail balang yang diambil sendiri. Sebagai contoh, dengan andaian anda mempunyai fail zip yang dipanggil myzip.zip, anda boleh melakukan langkah-langkah berikut untuk membuat fail yang diekstrak sendiri daripadanya:

  1. cd ke direktori yang mengandungi myzip.zip
  2. Muat turun zipper.jar
  3. Ekstrak fail ke dalam direktori semasa. Kami telah menjadikannya JAR yang diekstrak sendiri:
    java -jar zipper.jar 
  4. Salin zipper.classfail keZipSelfExtractor.class
  5. Namakan semula myzip.zipsebagaimyzip.jar
  6. Kemas kini myzip.jardengan jarmanifestdan ZipSelfExtractor.classfail:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Sekarang myzip.jarmengekstrak sendiri pada semua platform yang mengandungi Java Runtime Environment (JRE) 1.2 atau lebih baru. Untuk melaksanakan fail balang yang diekstrak sendiri, jalankan:

java -jar myzip.jar 

Perhatikan bahawa beberapa platform mungkin telah mengikat sehingga anda dapat menjalankan fail jar hanya dengan mengklik myzip.jarikon fail, yang akan menjalankan setara baris perintah.

Latihan untuk pembaca

Arus ZipSelfExtracttidak dapat disatukan dengan baik jika anda membuat JAR pengekstrakan sendiri dari fail balang yang ada yang mengandungi fail manifes. Tambahkan kepintaran ke pengekstrak diri dan arahan penciptaan supaya anda dapat menangani fail balang yang ada yang mengandungi fail manifes.

Bebaskan tangan anda dari JAR

Fail balang yang diekstrak sendiri adalah mekanisme yang baik untuk pengedaran fail merentas platform. JAR pengekstrakan sendiri mudah dibuat, dan keperluan pengguna minimum pemasangan JRE 1.2 atau lebih baru adalah pertukaran wajar untuk mendapatkan sokongan merentas platform.

Daripada membuat fail balang yang diekstrak sendiri secara manual, periksa ZipAnywhere. ZipAnywhere adalah alat lengkap zip/ jarutiliti yang ditulis dalam 100% murni Java. Ini adalah alat berasaskan GUI percuma dan WinZip dan dapat membuat fail balang yang diekstrak sendiri dengan satu klik butang.

Zunhe Steve Jin adalah jurutera perisian kakitangan di Rational Software dan pengarang ZipAnywhere. John D. Mitchell adalah penyumbang penyumbang kolom NW Trik JavaWorld. John juga merupakan pengasas dan ketua arkitek Non, Inc., amalan perundingan Pengurusan Risiko Perniagaan Teknologi.

Ketahui lebih lanjut mengenai topik ini

  • Muat turun fail sumber untuk petua ini

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

  • "Java Tip 49How to Extract Java Resources from JAR and Zip Archives," John D. Mitchell and Arthur Choi (JavaWorld)

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

  • "Java Tip 70Create Objects from Jar Files!" John D. Mitchell (JavaWorld)

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

  • Jar File Specification

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

  • JAR command line guide

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

  • ZipAnywhere, GUI-based self-extracting JAR creation tool

    //www.geocities.com/zipanywhere

  • 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 articles by topic in JavaWorld's Topical Index

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

  • Speak out in our Java Forum

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

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • You'll find a wealth of IT-related articles from our sister publications at .net

Kisah ini, "Petua Java 120: Jalankan pengekstrakan sendiri JAR" pada awalnya diterbitkan oleh JavaWorld.