Programiranje

Java Nasvet 127: Glejte JAR run

Celoten nabor razredov in virov aplikacije lahko enostavno spakirate v arhiv Java (JAR). Pravzaprav je to en cilj imeti datoteke jar. Druga možnost je omogočiti uporabnikom enostavno izvajanje aplikacije, shranjene v arhivu. Zakaj so potem datoteke jar drugorazredni državljani v vesolju Java - ki delujejo samo kot arhivi -, če so lahko prvovrstni, tik ob domačih izvršljivih datotekah?

Za zagon datoteke jar lahko uporabite datoteko

java

ukazov

-jar

možnost. Recimo na primer, da imate imenovano datoteko jar, ki jo je mogoče zagnati

myjar.jar

. Ker je datoteko mogoče zagnati, jo lahko zaženete tako:

java -jar myjar.jar

.

Java Runtime Environment (JRE), ko je nameščen v OS, kot je Microsoft Windows, poveže jar datoteke z JVM, tako da jih lahko dvokliknete za zagon aplikacije. Te JAR-je je treba zagnati.

Vprašanje je: Kako narediti JAR izvedljiv?

Datoteka manifesta in vnos glavnega razreda

Znotraj večine JAR-ov se imenuje datoteka

MANIFEST.MF

je shranjena v imeniku z imenom

META-INF

. Znotraj te datoteke se imenuje poseben vnos

Glavni razred

pove

java -jar

ukaz, kateri razred naj se izvede.

Težava je v tem, da morate ta poseben vnos pravilno dodati v datoteko manifesta sami - mora biti na določenem mestu in mora imeti določeno obliko. Vendar nekateri od nas ne marajo urejanja konfiguracijskih datotek.

Naj API naredi namesto vas

Od Jave 1.2 je paket z imenom java.util.jar vam omogoča delo z datotekami jar. (Opomba: gradi na java.util.zip paket.) Natančneje, paket jar vam omogoča enostavno manipulacijo s to posebno datoteko manifesta prek Manifest razred.

Napišimo program, ki uporablja ta API. Prvič, ta program mora vedeti o treh stvareh:

  1. JAR, ki ga želimo narediti izvedljivega
  2. Glavni razred, ki ga želimo izvesti (ta razred mora obstajati znotraj JAR)
  3. Ime novega JAR za naš izhod, ker ne bi smeli preprosto prepisovati datotek

Napišite program

Zgornji seznam predstavlja argumente našega programa. Na tej točki izberite primerno ime za to aplikacijo. Kako MakeJarRunnable zvok?

Preverite argumente za main

Predpostavimo, da je naša glavna vstopna točka standard glavni (niz []) metoda. Najprej bi morali preveriti programske argumente tukaj:

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

Prosimo, bodite pozorni na to, kako se razlaga seznam argumentov, saj je to pomembno za naslednjo kodo. Vrstni red in vsebina argumentov nista zastavljena; vendar ne pozabite ustrezno spremeniti druge kode, če jih spremenite.

Dostopite do datoteke JAR in njene manifestne datoteke

Najprej moramo ustvariti nekaj predmetov, ki vedo o JAR in datotekah manifesta:

 // Ustvarimo objekt JarInputStream in dobimo njegov manifest JarInputStream jarIn = new JarInputStream (new FileInputStream (args [0])); Manifestni manifest = jarIn.getManifest (); if (manifest == null) {// To se bo zgodilo, če ne obstaja manifest manifest = new Manifest (); } 

Nastavite atribut Main-Class

Postavili smo Glavni razred vnos v odsek glavnih atributov datoteke manifesta. Ko dobimo ta niz atributov iz predmeta manifesta, lahko nastavimo ustrezen glavni razred. Kaj pa, če a Glavni razred atribut že obstaja v prvotnem JAR-u? Ta program preprosto natisne opozorilo in izstopi. Morda bi lahko dodali argument ukazne vrstice, ki programu sporoča, naj uporabi novo vrednost namesto že obstoječe:

 Atributi a = manifest.getMainAttributes (); String oldMainClass = a.putValue ("Main-Class", args [1]); // Če obstaja stara vrednost, povejte uporabniku in zapustite if (oldMainClass! = Null) {System.out.println ("Opozorilo: stara vrednost glavnega razreda je:" + oldMainClass); System.exit (1); } 

Iznesite nov JAR

Ustvariti moramo novo datoteko jar, zato moramo uporabiti datoteko JarOutputStream razred. Opomba: Zagotoviti moramo, da za izhod ne uporabljamo iste datoteke kot za vnos. Mogoče bi moral program upoštevati primer, ko sta dve datoteki jar enaka, in uporabnika pozvati, če želi prepisati izvirnik. Vendar si to pridržujem kot vajo za bralca. S kodo naprej!

 System.out.println ("Zapisovanje v" + args [2] + "..."); JarOutputStream jarOut = nov JarOutputStream (nov FileOutputStream (argumenti [2]), manifest); 

Vsak vnos iz vhodnega JAR moramo zapisati v izhodni JAR, zato iteracijo nad vnosi:

 // Ustvarimo medpomnilnik za branje za prenos podatkov iz vhodnega bajta [] buf = nov bajt [4096]; // Ponovite vnose JarEntry entry; while ((entry = jarIn.getNextJarEntry ())! = null) {// Izključi datoteko manifesta iz stare JAR, če se ("META-INF / MANIFEST.MF" .equals (entry.getName ())) nadaljuje; // Vnos zapišite v izhodni JAR jarOut.putNextEntry (vnos); int branje; while ((branje = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, branje); } jarOut.closeEntry (); } // Izperite in zaprite vse tokove jarOut.flush (); jarOut.close (); jarIn.close (); 

Celoten program

Seveda moramo to kodo postaviti v glavni , znotraj razreda in z ustreznim nizom uvoznih stavkov. Poglavje Viri vsebuje celoten program.

Primer uporabe

Dajmo ta program v uporabo na primeru. Recimo, da imate aplikacijo, katere glavna vstopna točka je v razredu, imenovanem HelloRunnableWorld. (To je polno ime razreda.) Predpostavimo tudi, da ste ustvarili JAR z imenom myjar.jar, ki vsebuje celotno aplikacijo. Teči MakeJarRunnable na tej datoteki jar tako:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Kot že prej omenjeno, opazite, kako naročim seznam argumentov. Če pozabite na naročilo, zaženite ta program brez argumentov in odgovoril bo s sporočilom o uporabi.

Poskusite zagnati

java -jar

ukaz vklopljen

myjar.jar

in nato naprej

myjar_r.jar

. Upoštevajte razliko! Ko to storite, raziščite datoteke manifesta (

META-INF / MANIFEST.MF

) v vsakem JAR. (Oba JAR-ja najdete v

izvorna koda

.)

Tu je predlog: Poskusite narediti MakeJarRunnable program v izvedljiv JAR!

Teci z njim

Zagon JAR-ja z dvoklikom ali uporabo preprostega ukaza je vedno bolj priročno, kot če bi ga morali vključiti v svojo razredno pot in zagnati določen glavni razred. Specifikacija JAR vam pomaga pri tem, da vsebuje Glavni razred atribut za datoteko manifesta JAR. Program, ki ga predstavljam tukaj, vam omogoča uporabo Java-ovega API-ja JAR za enostavno manipulacijo s tem atributom in omogočanje JAR-jev, da jih je mogoče izvajati.

Shawn Silverman je trenutno podiplomski študent na oddelku za elektrotehniko in računalniški inženiring na Univerzi v Manitobi v Kanadi. Z Javo je začel sodelovati sredi leta 1996 in jo od takrat uporablja skoraj izključno. Njegovi trenutni interesi so simulacija električnih polj in tekočin, kode za odpravljanje napak in izvajanje izvrstnih trikov z grafičnim uporabniškim vmesnikom. Shawn predava tudi tretji letnik tečaja oblikovanja programske opreme na oddelku za računalniški inženiring na svoji univerzi.

Preberite več o tej temi

  • Za ta namig prenesite izvorno kodo in JAR-je

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

  • "Java Tip 120Execute Self-Extracting JARs," Z. Steve Jin in John D. Mitchell (JavaWorld, November 2001)

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

  • Specifikacija datoteke JAR

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

  • jar - Orodje za arhiviranje Java

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

  • Oglejte si vse prejšnje Java Nasveti in oddajte svojega

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

  • Naučite se Java od začetka v JavaWorld 's Java 101 stolpec

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Strokovnjaki za Javo odgovarjajo na najtežja vprašanja v zvezi z Javo JavaWorld 's Vprašanja in odgovori o Javi stolpec

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Prebrskajte Jedro Java odsek JavaWorld 's Aktualni indeks

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

  • Ostanite na vrhu Nasveti N trikov tako da se naročite na JavaWorld 'brezplačna tedenska glasila po e-pošti

    //www.javaworld.com/subscribe

  • Spoznajte osnove odjemalske Jave v JavaWorld 's Začetnik Java diskusija. Temeljne teme vključujejo jezik Java, navidezni stroj Java, API-je in razvojna orodja

    //forums.idg.net/webx?50@@.ee6b804

  • Na naslovu .net boste našli ogromno člankov, povezanih z IT, iz naših sestrskih publikacij

To zgodbo, "Java Nasvet 127: glej JAR run", je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found