Petua Java 127: Lihat JAR dijalankan

Anda dapat dengan mudah mengemas seluruh kelas dan sumber aplikasi ke dalam Java Archive (JAR). Sebenarnya, itu adalah satu tujuan untuk mempunyai fail jar. Yang lain ialah membiarkan pengguna melaksanakan aplikasi yang disimpan dalam arkib dengan mudah. Lalu mengapa fail jar adalah warga kelas kedua di alam semesta Java - berfungsi hanya sebagai arkib - ketika mereka dapat menjadi kelas satu, tepat di samping yang dapat dilaksanakan?

Untuk melaksanakan fail jar, anda boleh menggunakan

java

arahan

-jar

pilihan. Sebagai contoh, katakan anda mempunyai fail jar yang boleh dijalankan

myjar.jar

. Kerana fail boleh dijalankan, anda boleh melaksanakannya seperti ini:

java -jar myjar.jar

.

Sebagai alternatif, Java Runtime Environment (JRE), apabila dipasang pada OS seperti Microsoft Windows, mengaitkan fail jar dengan JVM sehingga anda dapat mengklik dua kali pada mereka untuk menjalankan aplikasi. JAR ini mesti dijalankan.

Persoalannya ialah: Bagaimana anda membuat JAR dapat dijalankan?

Fail manifes dan entri Kelas Utama

Di dalam kebanyakan JAR, fail dipanggil

MANIFEST.MF

disimpan dalam direktori yang dipanggil

META-INF

. Di dalam fail itu, entri khas dipanggil

Main-Class

memberitahu

java -jar

perintah kelas mana yang hendak dilaksanakan.

Masalahnya ialah anda mesti menambahkan entri khas ini ke fail manifes dengan betul - ia mesti masuk ke tempat tertentu dan mesti mempunyai format tertentu. Namun, sebilangan daripada kita tidak suka mengedit fail konfigurasi.

Biarkan API melakukannya untuk anda

Sejak Java 1.2, pakej yang disebut java.util.jartelah memungkinkan anda bekerja dengan fail jar. (Catatan: Ia dibuat berdasarkan java.util.zippaket.) Secara khusus, paket jar membolehkan anda memanipulasi fail manifes khas itu dengan mudah melalui Manifestkelas.

Mari tulis program yang menggunakan API ini. Pertama, program ini mesti mengetahui mengenai tiga perkara:

  1. JAR yang ingin kami jalankan
  2. Kelas utama yang ingin kami laksanakan (kelas ini mesti ada di dalam JAR)
  3. Nama JAR baru untuk output kami, kerana kami tidak boleh hanya menimpa fail

Tulis program

Senarai di atas akan menjadi hujah program kami. Pada ketika ini, mari kita pilih nama yang sesuai untuk aplikasi ini. Bagaimana MakeJarRunnablebunyi?

Periksa hujah untuk utama

Andaikan titik masuk utama kami adalah main(String[])kaedah standard . Kita harus memeriksa argumen program terlebih dahulu di sini:

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

Perhatikan bagaimana senarai argumen ditafsirkan, kerana penting untuk kod berikut. Urutan dan isi hujah tidak dibongkarkan; namun, ingatlah untuk mengubah kod yang lain dengan betul jika anda mengubahnya.

Akses JAR dan fail manifesnya

Pertama, kita mesti membuat beberapa objek yang mengetahui mengenai fail JAR dan manifes:

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

Tetapkan atribut Kelas Utama

Kami meletakkan Main-Classentri di bahagian atribut utama fail manifes. Setelah kami memperoleh atribut ini dari objek manifes, kami dapat menetapkan kelas utama yang sesuai. Namun, bagaimana jika Main-Classatribut sudah ada dalam JAR yang asal? Program ini hanya mencetak amaran dan keluar. Mungkin kita dapat menambahkan argumen baris perintah yang memberitahu program menggunakan nilai baru dan bukannya yang sudah ada:

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

Keluarkan JAR baru

Kita perlu membuat fail balang baru, jadi kita mesti menggunakan JarOutputStreamkelas. Catatan: Kita mesti memastikan bahawa kita tidak menggunakan fail yang sama untuk output seperti yang kita lakukan untuk input. Sebagai alternatif, mungkin program ini harus mempertimbangkan kes di mana kedua-dua fail balang itu sama dan meminta pengguna sekiranya dia ingin menimpa yang asli. Walau bagaimanapun, saya menganggap ini sebagai latihan untuk pembaca. Hidup dengan kod!

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

Kita mesti menulis setiap entri dari JAR masukan ke JAR keluaran, sehingga berulang dari entri:

// Buat buffer baca untuk memindahkan data dari bait input [] buf = bait baru [4096]; // Selesaikan entri JarEntry; sementara ((entri = jarIn.getNextJarEntry ())! = null) {// Kecualikan fail manifes dari JAR lama jika ("META-INF / MANIFEST.MF" .equals (entry.getName ())) terus; // Tulis entri ke output JAR jarOut.putNextEntry (entri); int membaca; sementara ((baca = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, baca); } jarOut.closeEntry (); } // Siram dan tutup semua aliran jarOut.flush (); jarOut.close (); jarIn.close ();

Program yang lengkap

Of course, we must place this code inside a main method, inside a class, and with a suitable set of import statements. The Resources section provides the complete program.

Usage example

Let's put this program to use with an example. Suppose you have an application whose main entry point is in a class called HelloRunnableWorld. (This is the full class name.) Also assume that you've created a JAR called myjar.jar, containing the entire application. Run MakeJarRunnable on this jar file like so:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Again, as mentioned earlier, notice how I order the argument list. If you forget the order, just run this program with no arguments and it will respond with a usage message.

Try to run the

java -jar

command on

myjar.jar

and then on

myjar_r.jar

. Note the difference! After you've done that, explore the manifest files (

META-INF/MANIFEST.MF

) in each JAR. (You can find both JARs in the

source code

.)

Here's a suggestion: Try to make the MakeJarRunnable program into a runnable JAR!

Run with it

Running a JAR by double-clicking it or using a simple command is always more convenient than having to include it in your classpath and running a specific main class. To help you do this, the JAR specification provides a Main-Class attribute for the JAR's manifest file. The program I present here lets you utilize Java's JAR API to easily manipulate this attribute and make your JARs runnable.

Shawn Silverman kini merupakan pelajar siswazah di jurusan kejuruteraan elektrik dan komputer di University of Manitoba di Kanada. Dia mulai bekerja dengan Java pada pertengahan 1996, dan sejak itu menggunakannya secara eksklusif. Minatnya sekarang termasuk simulasi medan elektrik dan cecair, kod pembetulan kesalahan, dan pelaksanaan trik GUI (antara muka pengguna grafik) yang bagus. Shawn juga mengajar kursus reka bentuk perisian tahun ketiga di jurusan kejuruteraan komputer di universiti.

Ketahui lebih lanjut mengenai topik ini

  • Muat turun kod sumber dan JAR untuk petua ini

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

  • "Petua Java 120Jalankan JAR Pengekstrakan Diri," 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 perkembangan Tip 'N Tricks kami dengan melanggan buletin e-mel percuma JavaWorld

    //www.javaworld.com/subscribe

  • Mempelajari asas-asas klien Java dalam JavaWorld ' s Java Permulaan perbincangan. Topik teras merangkumi bahasa Java, Mesin Maya Java, API, dan alat pengembangan

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

  • Anda akan mendapat banyak artikel berkaitan IT dari penerbitan saudara kami di .net

Kisah ini, "Java Tip 127: See JAR run" pada mulanya diterbitkan oleh JavaWorld.