Tip Java 120: Jalankan JAR yang mengekstraksi sendiri

Selama bertahun-tahun, pembuatan arsip Phil Katz, zip, telah menjadi salah satu format pengarsipan file yang paling populer. Sun telah mengadopsi format zip sebagai dasar Java Archive (JAR). Sun telah memperluas penggunaan format zip dengan berbagai konvensi sehingga Anda dapat mengemas kelas Java ke dalam file arsip. Dengan tambahan file manifes JAR , runtime Java dapat dengan mudah menemukan dan langsung menjalankan kelas utama aplikasi Java yang terdapat dalam file jar.

Beberapa zipalat utilitas dapat membuat arsip yang mengekstrak sendiri untuk berbagai platform, seperti MS Windows. Alat utilitas menggabungkan arsip zip biasa dengan program ekstraktor untuk menghasilkan file executable (exe) baru. Penerima file exe hanya perlu menjalankannya untuk mengekstrak konten arsip zip asli. Eksekusi menjalankan program ekstraktor untuk mengekstrak file yang diarsipkan ke direktori output yang ditentukan pengguna.

Anda dapat mengonversi file zip atau jar dasar menjadi file jar yang dapat dieksekusi pada platform Java apa pun. Sedangkan zip yang mengekstrak sendiri hanya dapat membuat file executable khusus platform, file jar yang mengekstrak sendiri dapat didistribusikan dan dijalankan di platform apa pun yang mendukung Java.

Membuat file jar yang mengekstraksi sendiri sangatlah mudah. Anda hanya memerlukan file manifes JAR khusus, program ekstraksi berbasis Java, file zip atau jar yang berisi file konten dasar, dan jaraplikasi utilitas Java SDK apa pun .

File manifes

Untuk membuat JAR yang dapat dieksekusi, pertama-tama Anda memerlukan file manifes yang disebut MANIFEST.MFdalam META-INFdirektori. File manifes mungkin berisi sejumlah kemungkinan entri; namun, untuk tujuan kita di sini, kita hanya perlu menentukan nama kelas Java yang berisi main()metode program ekstraktor berbasis Java :

Kelas Utama: ZipSelfExtractor 

Kami telah menambahkan file manifes yang diberi nama jarmanifestke kode contoh tip ini. Untuk informasi selengkapnya tentang file manifes, lihat Spesifikasi File Jar.

Ekstraktor

Anda dapat membuat program ekstraktor menggunakan berbagai pendekatan. Pendekatan yang kami sajikan di sini sederhana dan lugas. Pertama, program ekstraksi mengetahui nama file jar yang mengekstrak sendiri. Dengan nama tersebut, ekstraktor menggunakan pustaka zip / jar Java bawaan untuk mengekstrak file konten dari arsip. Anda dapat menemukan kode sumber lengkapnya ZipSelfExtractordi ZipSelfExtractor.java.

Mendapatkan nama file jar di program ekstraktor bisa jadi rumit. Meskipun nama file jar muncul di baris perintah, nama itu tidak diteruskan ke metode kelas main(). Oleh karena itu, dalam program ekstraktor, kami menggunakan kode berikut untuk mengekstrak informasi dari URL yang mengarah ke ekstraktor:

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

Perhatikan bahwa dalam getSystemResource()metode yang kita lewati, myClassNamebukan ZipSelfExtractor.class. Itu memungkinkan kita mengubah nama program ekstraktor tanpa mengubah bagian kode itu. Kami mengatur myClassNamedengan mencari nama kelas saat ini.

Selanjutnya, kami mengekstrak nama file jar. Pertama, kami meminta URL ke file kelas yang berisi kelas yang sedang berjalan (yang merupakan program ekstraktor). Setelah kami memiliki URL, kami dapat mengambil nama file jar. Menurut definisi, URL program ekstraktor JAR mengikuti format dasar:

  1. jar:, yang menunjukkan bahwa eksekusi dijalankan dari dalam file jar
  2. URL file jar, seperti file:/C:/temp/test.jar, diikuti dengan !karakter
  3. Nama jalur internal file dalam JAR, seperti /ZipSelfExtractor.class

Dalam kasus program ekstraktor, URL mungkin terlihat seperti:

jar: file: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Sekarang setelah kita memiliki nama file jar, kita dapat melakukan ekstraksi. Inti dari program ekstraksi bergantung pada pustaka manipulasi file zip / jar Java bawaan untuk membuka kompresi file konten yang terdapat dalam arsip. Lihat Sumber Daya untuk lebih lanjut tentang pustaka manipulasi file zip / jar.

Untuk kemudahan penggunaan, ekstraktor adalah aplikasi Java grafis. Aplikasi menggunakan JFileChooserkelas untuk memungkinkan pengguna menentukan direktori tujuan yang mereka inginkan untuk mengekstrak file. A ProgressMonitormenunjukkan kemajuan proses ekstraksi. Jika sebuah file mungkin menimpa file yang sudah ada, pengguna ditanya apakah akan menimpa file yang sudah ada atau tidak. Pada kesimpulannya, kotak dialog standar menyajikan statistik ekstraksi.

Terakhir, program ekstraktor memeriksa bahwa ia tidak mengekstrak file yang membuat file jar mengekstrak sendiri - file manifes dan file ekstraktor .class; program seharusnya hanya mengekstrak konten JAR asli. Kedua file tersebut adalah artefak dari file jar yang mengekstrak sendiri dan bukan bagian dari file konten dasar asli.

Mengemas file jar

Sekarang kita memiliki file manifes dan program ekstraktor, kita dapat membuat file jar yang mengekstrak sendiri. Kita dapat secara manual menggunakan jarutilitas JDK untuk membuat file jar yang mengekstrak sendiri. Misalnya, dengan asumsi Anda memiliki file zip yang dipanggil myzip.zip, Anda dapat melakukan langkah-langkah berikut untuk membuat file yang mengekstrak sendiri darinya:

  1. cd ke direktori yang berisi myzip.zip
  2. Unduh zipper.jar
  3. Ekstrak file ke direktori saat ini. Kami telah membuatnya menjadi JAR yang mengekstraksi sendiri:
    java -jar zipper.jar 
  4. Salin zipper.classfile keZipSelfExtractor.class
  5. Ubah nama myzip.zipmenjadimyzip.jar
  6. Perbarui myzip.jardengan file jarmanifestdan ZipSelfExtractor.class:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Sekarang myzip.jarmengekstrak sendiri di semua platform yang berisi Java Runtime Environment (JRE) 1.2 atau yang lebih baru. Untuk menjalankan file jar yang mengekstrak sendiri, jalankan:

java -jar myzip.jar 

Perhatikan bahwa beberapa platform mungkin memiliki binding yang sudah disiapkan sehingga Anda dapat menjalankan file jar hanya dengan mengklik myzip.jarikon file, yang akan menjalankan baris perintah yang setara.

Latihan untuk pembaca

Arus ZipSelfExtracttidak terintegrasi dengan baik jika Anda membuat JAR yang mengekstrak sendiri dari file jar yang ada yang berisi file manifes. Tambahkan kecerdasan ke self-extractor dan instruksi pembuatan sehingga Anda dapat menangani file jar yang sudah ada yang berisi file manifes.

Bebaskan tangan Anda dari JAR

File jar yang mengekstrak sendiri adalah mekanisme yang baik untuk distribusi file lintas platform. JAR yang mengekstraksi sendiri mudah dibuat, dan persyaratan pengguna minimal untuk pemasangan JRE 1.2 atau yang lebih baru adalah pertukaran yang wajar untuk mendapatkan dukungan lintas platform.

Alih-alih membuat file jar yang mengekstraksi sendiri secara manual, lihat ZipAnywhere. ZipAnywhere adalah alat berfitur lengkap zip/ jarutilitas yang ditulis dalam 100% Java murni. Ini adalah alat berbasis GUI gratis ala WinZip dan dapat membuat file jar yang mengekstrak sendiri dengan mengklik tombol.

Zunhe Steve Jin adalah staf insinyur perangkat lunak di Rational Software dan penulis ZipAnywhere. John D. Mitchell adalah editor kontribusi kolom Trik Tips JavaWorld. John juga merupakan pendiri dan arsitek utama Non, Inc., sebuah praktik konsultasi Manajemen Risiko Bisnis Teknologi.

Pelajari lebih lanjut tentang topik ini

  • Unduh file sumber untuk tip 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

Artikel ini, "Java Tip 120: Execute self-extracting JARs", awalnya diterbitkan oleh JavaWorld.