Java savjet 127: Pogledajte JAR pokretanje

Cjelokupni skup klasa i resursa aplikacije možete jednostavno spakirati u Java arhivu (JAR). Zapravo je to jedan cilj posjedovanja jar datoteka. Druga je mogućnost omogućavanja korisnicima da lako izvrše aplikaciju pohranjenu u arhivi. Zašto onda jar datoteke drugorazrednih građana u Java svemiru - funkcioniraju samo kao arhive - kad mogu biti prvoklasne, uz bok izvornim izvršnim datotekama?

Da biste izvršili jar datoteku, možete koristiti

java

naredbe

-jar

opcija. Na primjer, recimo da imate nazvanu jar datoteku koja se može pokrenuti

myjar.jar

. Budući da je datoteku moguće pokrenuti, možete je izvršiti ovako:

java -jar myjar.jar

.

Alternativno, Java Runtime Environment (JRE), kada je instaliran na OS poput Microsoft Windows, povezuje jar datoteke s JVM-om, tako da možete dvaput kliknuti na njih da biste pokrenuli aplikaciju. Ovi JAR-ovi moraju se pokretati.

Pitanje je: Kako napraviti JAR pokretan?

Datoteka manifesta i unos glavne klase

Unutar većine JAR-ova datoteka se naziva

MANIFEST.MF

je pohranjen u direktoriju nazvanom

META-INF

. Unutar te datoteke, poseban unos pod nazivom

Main-Class

govori

java -jar

naredba koju klasu izvršiti.

Problem je u tome što ovaj poseban unos morate pravilno dodati u datoteku manifesta - mora ići na određeno mjesto i mora imati određeni format. Međutim, neki od nas ne vole uređivanje konfiguracijskih datoteka.

Neka API to učini umjesto vas

Od Jave 1.2, zvani paket java.util.jaromogućuje vam rad s jar datotekama. (Napomena: Gradi se na java.util.zippaketu.) Konkretno, paket jar omogućuje vam lako upravljanje tom posebnom datotekom manifesta putem Manifestklase.

Napišimo program koji koristi ovaj API. Prvo, ovaj program mora znati o tri stvari:

  1. JAR koji želimo učiniti mogućim za pokretanje
  2. Glavna klasa koju želimo izvršiti (ova klasa mora postojati unutar JAR-a)
  3. Naziv novog JAR-a za naš izlaz, jer ne bismo trebali jednostavno prepisivati ​​datoteke

Napišite program

Gornji popis činit će argumente našeg programa. U ovom trenutku, odaberite prikladno ime za ovu aplikaciju. Kako MakeJarRunnablezvuči?

Provjerite argumente za glavni

Pretpostavimo da je naša glavna ulazna točka standardna main(String[])metoda. Prvo bismo trebali provjeriti programske argumente ovdje:

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

Molimo obratite pažnju na to kako se tumači popis argumenata, jer je to važno za sljedeći kod. Redoslijed i sadržaj argumenata nisu postavljeni; međutim, ne zaboravite na odgovarajući način izmijeniti drugi kod ako ih promijenite.

Pristupite JAR-u i njegovoj datoteci manifesta

Prvo moramo stvoriti neke objekte koji znaju o JAR-u i manifestnim datotekama:

// Stvorimo objekt JarInputStream i dobivamo njegov manifest JarInputStream jarIn = novi JarInputStream (novi FileInputStream (args [0])); Manifest manifest = jarIn.getManifest (); if (manifest == null) {// To će se dogoditi ako ne postoji manifest manifest = new Manifest (); }

Postavite atribut Main-Class

Main-ClassUnos smo stavili u odjeljak glavnih atributa datoteke manifesta. Jednom kada dobijemo ovaj skup atributa iz objekta manifesta, možemo postaviti odgovarajuću glavnu klasu. Međutim, što ako Main-Classatribut već postoji u izvornom JAR-u? Ovaj program jednostavno ispisuje upozorenje i izlazi. Možda bismo mogli dodati argument naredbenog retka koji programu govori da koristi novu vrijednost umjesto one koja već postoji:

Atributi a = manifest.getMainAttributes (); Niz oldMainClass = a.putValue ("Glavna klasa", argumenti [1]); // Ako postoji stara vrijednost, recite korisniku i izađite ako (oldMainClass! = Null) {System.out.println ("Upozorenje: stara vrijednost glavne klase je:" + oldMainClass); System.exit (1); }

Iznesite novi JAR

Moramo stvoriti novu jar datoteku, pa moramo koristiti JarOutputStreamklasu. Napomena: Moramo osigurati da ne koristimo istu datoteku za izlaz kao i za ulaz. Alternativno, možda bi program trebao razmotriti slučaj kada su dvije jar datoteke iste i zatražiti od korisnika ako želi prebrisati izvornik. Međutim, ovo rezerviram kao vježbu za čitatelja. Nastavite s kodom!

System.out.println ("Zapisivanje u" + args [2] + "..."); JarOutputStream jarOut = novi JarOutputStream (novi FileOutputStream (argumenti [2]), manifest);

Moramo upisati svaki unos iz ulaznog JAR-a u izlazni JAR, pa iterirati preko unosa:

// Stvorimo međuspremnik za čitanje za prijenos podataka iz ulaznog bajta [] buf = novi bajt [4096]; // Ponovite unose JarEntry entry; while ((entry = jarIn.getNextJarEntry ())! = null) {// Izuzmite datoteku manifesta iz starog JAR-a ako se ("META-INF / MANIFEST.MF" .equals (entry.getName ())) nastavi; // Napišite zapis na izlaz JAR jarOut.putNextEntry (entry); int read; while ((read = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, read); } jarOut.closeEntry (); } // Isperite i zatvorite sve tokove jarOut.flush (); jarOut.close (); jarIn.close ();

Kompletan program

Naravno, ovaj kôd moramo smjestiti unutar mainmetode, unutar klase i s prikladnim skupom naredbi za uvoz. Odjeljak Resursi pruža cjelovit program.

Primjer upotrebe

Primijenimo ovaj program na primjer. Pretpostavimo da imate aplikaciju čija je glavna ulazna točka u klasi koja se zove HelloRunnableWorld. (Ovo je puni naziv klase.) Također pretpostavite da ste stvorili JAR pod nazivom myjar.jar, koji sadrži cijelu aplikaciju. Pokreni MakeJarRunnableovu datoteku jar tako:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Opet, kao što je ranije spomenuto, primijetite kako poredam popis argumenata. Ako zaboravite narudžbu, samo pokrenite ovaj program bez argumenata i on će odgovoriti porukom o upotrebi.

Pokušajte pokrenuti

java -jar

zapovijedi na

myjar.jar

a zatim dalje

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 trenutno je apsolvent na odsjeku za elektrotehniku ​​i računalno inženjerstvo na Sveučilištu Manitoba u Kanadi. S Javom je počeo raditi sredinom 1996. godine i od tada je koristi gotovo gotovo. Njegovi trenutni interesi uključuju simulaciju električnih polja i fluida, kodove za ispravljanje pogrešaka i provedbu sjajnih trikova s ​​GUI-jem (grafičko korisničko sučelje). Shawn također predaje treću godinu tečaja softverskog dizajna na odjelu računalnog inženjerstva na svom sveučilištu.

Saznajte više o ovoj temi

  • Preuzmite izvorni kod i JAR-ove za ovaj savjet

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

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

  • Budite u toku s našim trikovima Savjeta pretplaćujući se na besplatne tjedne biltene e-pošte tvrtke JavaWorld

    //www.javaworld.com/subscribe

  • Naučite osnove na strani klijenta Java u JavaWorld” s Java za početnike raspravu. Temeljne teme uključuju jezik Java, Java virtualni stroj, API-je i razvojne alate

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

  • Mnoštvo članaka vezanih uz IT iz naših sestrinskih publikacija pronaći ćete na .net

Ovu je priču "Java savjet 127: pogledajte JAR pokretanje" izvorno objavio JavaWorld.