Tip Java 127: Lihat JAR run

Anda dapat dengan mudah mengemas seluruh kumpulan kelas dan sumber daya aplikasi ke dalam Arsip Java (JAR). Sebenarnya, itu adalah salah satu tujuan memiliki file jar. Cara lainnya adalah membiarkan pengguna dengan mudah menjalankan aplikasi yang disimpan dalam arsip. Lalu mengapa file jar warga kelas dua di jagat Java — hanya berfungsi sebagai arsip — padahal mereka bisa menjadi kelas satu, tepat di samping executable asli?

Untuk menjalankan file jar, Anda dapat menggunakan

java

perintah

-jar

pilihan. Misalnya, Anda memiliki file jar yang dapat dijalankan bernama

myjar.jar

. Karena file dapat dijalankan, Anda dapat menjalankannya seperti ini:

java -jar myjar.jar

.

Alternatifnya, Java Runtime Environment (JRE), ketika diinstal pada OS seperti Microsoft Windows, mengaitkan file jar dengan JVM sehingga Anda dapat mengklik dua kali di atasnya untuk menjalankan aplikasi. JAR ini harus dapat dijalankan.

Pertanyaannya adalah: Bagaimana Anda membuat JAR dapat dijalankan?

File manifes dan entri Kelas-Utama

Di dalam kebanyakan JAR, sebuah file bernama

MANIFEST.MF

disimpan dalam direktori bernama

META-INF

. Di dalam file itu, entri khusus bernama

Main-Class

memberitahu

java -jar

perintah kelas mana yang akan dijalankan.

Masalahnya adalah Anda harus menambahkan entri khusus ini dengan benar ke file manifes — entri tersebut harus berada di tempat tertentu dan harus memiliki format tertentu. Namun, beberapa dari kita tidak suka mengedit file konfigurasi.

Biarkan API melakukannya untuk Anda

Sejak Java 1.2, paket yang dipanggil java.util.jarmemungkinkan Anda bekerja dengan file jar. (Catatan: Ini dibangun di atas java.util.zippaket.) Secara khusus, paket jar memungkinkan Anda dengan mudah memanipulasi file manifes khusus melalui Manifestkelas.

Mari kita tulis program yang menggunakan API ini. Pertama, program ini harus mengetahui tiga hal:

  1. JAR yang ingin kami buat dapat dijalankan
  2. Kelas utama yang ingin kami jalankan (kelas ini harus ada di dalam JAR)
  3. Nama JAR baru untuk keluaran kita, karena kita tidak boleh hanya menimpa file

Tulis programnya

Daftar di atas akan menjadi argumen program kami. Pada titik ini, mari pilih nama yang cocok untuk aplikasi ini. Bagaimana MakeJarRunnablesuaranya?

Periksa argumen ke main

Asumsikan titik masuk utama kita adalah main(String[])metode standar . Pertama-tama kita harus memeriksa argumen program di sini:

if (args.length! = 3) {System.out.println ("Penggunaan: MakeJarRunnable" + ""); System.exit (0); }

Harap perhatikan bagaimana daftar argumen diinterpretasikan, karena ini penting untuk kode berikut. Urutan dan isi argumen tidak ditetapkan di atas batu; namun, ingatlah untuk mengubah kode lain dengan tepat jika Anda mengubahnya.

Akses JAR dan file manifesnya

Pertama, kita harus membuat beberapa objek yang mengetahui tentang JAR dan file manifes:

// Buat objek JarInputStream, dan dapatkan manifesnya JarInputStream jarIn = new JarInputStream (new FileInputStream (args [0])); Manifes manifes = jarIn.getManifest (); if (manifest == null) {// Ini akan terjadi jika tidak ada manifes manifest = new Manifest (); }

Setel atribut Kelas-Utama

Kami meletakkan Main-Classentri di bagian atribut utama file manifes. Setelah kita mendapatkan set atribut ini dari objek manifes, kita dapat mengatur kelas utama yang sesuai. Namun, bagaimana jika Main-Classatribut sudah ada di JAR asli? Program ini hanya mencetak peringatan dan keluar. Mungkin kita bisa menambahkan argumen baris perintah yang memberi tahu program untuk menggunakan nilai baru daripada yang sudah ada sebelumnya:

Atribut a = manifest.getMainAttributes (); String oldMainClass = a.putValue ("Kelas-Utama", args [1]); // Jika ada nilai lama, beri tahu pengguna dan keluar jika (oldMainClass! = Null) {System.out.println ("Peringatan: nilai Main-Class lama adalah:" + oldMainClass); System.exit (1); }

Keluarkan JAR baru

Kita perlu membuat file jar baru, jadi kita harus menggunakan JarOutputStreamclass tersebut. Catatan: Kita harus memastikan bahwa kita tidak menggunakan file yang sama untuk keluaran seperti yang kita lakukan untuk masukan. Alternatifnya, mungkin program harus mempertimbangkan kasus di mana dua file jar adalah sama dan meminta pengguna jika dia ingin menimpa yang asli. Namun, ini saya simpan sebagai latihan untuk pembaca. Lanjutkan dengan kode!

System.out.println ("Menulis ke" + args [2] + "..."); JarOutputStream jarOut = JarOutputStream baru (FileOutputStream baru (args [2]), manifest);

Kita harus menulis setiap entri dari JAR masukan ke JAR keluaran, jadi lakukan iterasi atas entri:

// Buat buffer baca untuk mentransfer data dari input byte [] buf = new byte [4096]; // Iterasi entri JarEntry; while ((entry = jarIn.getNextJarEntry ())! = null) {// Kecualikan file manifes dari JAR lama jika ("META-INF / MANIFEST.MF" .equals (entry.getName ())) lanjutkan; // Tulis entri ke keluaran JAR jarOut.putNextEntry (entry); int baca; while ((read = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, read); } jarOut.closeEntry (); } // Flush dan tutup semua stream jarOut.flush (); jarOut.close (); jarIn.close ();

Program lengkap

Tentu saja, kita harus menempatkan kode ini di dalam mainmetode, di dalam kelas, dan dengan satu set pernyataan import yang sesuai. Bagian Sumber daya menyediakan program lengkap.

Contoh penggunaan

Mari kita gunakan program ini dengan sebuah contoh. Misalkan Anda memiliki aplikasi yang titik masuk utamanya ada di kelas bernama HelloRunnableWorld. (Ini adalah nama kelas lengkap.) Juga asumsikan bahwa Anda telah membuat JAR yang dipanggil myjar.jar, berisi seluruh aplikasi. Jalankan MakeJarRunnablefile jar ini seperti:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Sekali lagi, seperti yang disebutkan sebelumnya, perhatikan bagaimana saya mengurutkan daftar argumen. Jika Anda lupa urutannya, jalankan saja program ini tanpa argumen dan itu akan merespons dengan pesan penggunaan.

Cobalah untuk menjalankan

java -jar

perintah

myjar.jar

dan selanjutnya

myjar_r.jar

. Perhatikan perbedaannya! Setelah Anda selesai melakukannya, jelajahi file manifes (

META-INF/MANIFEST.MF

) di setiap JAR. (Anda dapat menemukan kedua JAR di file

Kode sumber

.)

Berikut sarannya: Cobalah untuk membuat MakeJarRunnableprogram menjadi JAR yang dapat dijalankan!

Jalankan dengan itu

Menjalankan JAR dengan mengklik dua kali atau menggunakan perintah sederhana selalu lebih mudah daripada harus memasukkannya ke dalam classpath Anda dan menjalankan kelas utama tertentu. Untuk membantu Anda melakukan ini, spesifikasi JAR menyediakan Main-Classatribut untuk file manifes JAR. Program yang saya sajikan di sini memungkinkan Anda memanfaatkan JAR API Java untuk dengan mudah memanipulasi atribut ini dan membuat JAR Anda dapat dijalankan.

Shawn Silverman saat ini adalah mahasiswa pascasarjana di departemen teknik kelistrikan dan komputer di Universitas Manitoba di Kanada. Dia mulai bekerja dengan Java pada pertengahan tahun 1996, dan telah menggunakannya hampir secara eksklusif sejak saat itu. Minatnya saat ini termasuk simulasi medan listrik dan cairan, kode koreksi kesalahan, dan implementasi trik GUI (antarmuka pengguna grafis) yang bagus. Shawn juga mengajar mata kuliah desain perangkat lunak tahun ketiga di departemen teknik komputer di universitasnya.

Pelajari lebih lanjut tentang topik ini

  • Unduh kode sumber dan JAR untuk tip ini

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

  • "Java Tip 120Execute Self-Extracting JARs," Z. Steve Jin dan John D. Mitchell ( JavaWorld, November 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

  • Ikuti terus Trik Tip 'N kami dengan berlangganan buletin email mingguan gratis JavaWorld

    //www.javaworld.com/subscribe

  • Pelajari dasar-dasar client-side Java di JavaWorld' s Java Pemula diskusi. Topik inti mencakup bahasa Java, Mesin Virtual Java, API, dan alat pengembangan

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

  • Anda akan menemukan banyak artikel terkait TI dari publikasi saudara kita di .net

Artikel ini, "Java Tip 127: See JAR run", awalnya diterbitkan oleh JavaWorld.