Programovanie

Java Tip 127: Pozrite si spustenie JAR

Celú sadu tried a prostriedkov aplikácie môžete ľahko zbaliť do archívu Java (JAR). V skutočnosti je to jeden cieľ mať súbory jar. Ďalším je umožniť používateľom jednoduché vykonávanie aplikácií uložených v archíve. Prečo sú potom súbory jar občania druhej triedy vo vesmíre Java - fungujú iba ako archívy - keď môžu byť prvotriedne, hneď vedľa natívnych spustiteľných súborov?

Na vykonanie súboru jar môžete použiť

java

veliteľské

-jar

možnosť. Povedzme napríklad, že máte spustiteľný súbor jar s názvom

myjar.jar

. Pretože je súbor spustiteľný, môžete ho spustiť takto:

java -jar myjar.jar

.

Prípadne Java Runtime Environment (JRE), keď je nainštalovaný na operačnom systéme ako Microsoft Windows, priraďuje súbory jar k JVM, takže na ne môžete dvojitým kliknutím spustiť aplikáciu. Tieto súbory JAR musia byť spustiteľné.

Otázka znie: Ako nastavíte spustiteľný súbor JAR?

Súbor manifestu a položka hlavnej triedy

Vo väčšine súborov JAR je súbor s názvom

MANIFEST.MF

je uložený v adresári s názvom

META-INF

. Vo vnútri tohto súboru sa volala špeciálna položka

Hlavná trieda

hovorí

java -jar

príkaz, ktorá trieda sa má vykonať.

Problém je v tom, že túto špeciálnu položku musíte správne pridať do súboru manifestu sami - musí ísť na určitom mieste a musí mať určitý formát. Niektorí z nás však neradi upravujú konfiguračné súbory.

Nechajte API, nech to urobí za vás

Od verzie Java 1.2 sa volá balík java.util.jar vám umožní pracovať so súbormi jar. (Poznámka: Nadväzuje na java.util.zip Konkrétne balík jar vám umožňuje ľahko manipulovať s týmto špeciálnym súborom manifestu prostredníctvom súboru Manifest trieda.

Poďme napísať program, ktorý používa toto API. Po prvé, tento program musí vedieť o troch veciach:

  1. JAR, ktorý chceme vytvoriť spustiteľný
  2. Hlavná trieda, ktorú chceme vykonať (táto trieda musí existovať vo vnútri JAR)
  3. Názov nového súboru JAR pre náš výstup, pretože by sme nemali súbory jednoducho prepísať

Napíš program

Vyššie uvedený zoznam bude predstavovať argumenty nášho programu. V tejto chvíli si vyberieme vhodný názov pre túto aplikáciu. Ako to robí? MakeJarRunnable zvuk?

Skontrolujte argumenty k main

Predpokladajme, že náš hlavný vstupný bod je štandard main (Reťazec []) metóda. Najprv by sme mali skontrolovať argumenty programu tu:

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

Venujte pozornosť tomu, ako sa interpretuje zoznam argumentov, pretože je to dôležité pre nasledujúci kód. Poradie a obsah argumentov nie sú vytesané do kameňa; Nezabudnite však primerane upraviť druhý kód, ak ich zmeníte.

Prístup k súboru JAR a jeho manifestu

Najprv musíme vytvoriť niekoľko objektov, ktoré vedia o súboroch JAR a manifestoch:

 // Vytvorte objekt JarInputStream a získajte jeho manifest JarInputStream jarIn = nový JarInputStream (nový FileInputStream (args [0])); Manifest manifest = jarIn.getManifest (); if (manifest == null) {// Stane sa to, ak neexistuje žiadny manifest manifest = nový Manifest (); } 

Nastavte atribút Hlavná trieda

Dali sme Hlavná trieda položka v sekcii hlavných atribútov súboru manifestu. Keď získame túto sadu atribútov z objektu manifestu, môžeme nastaviť príslušnú hlavnú triedu. Čo však, ak a Hlavná trieda atribút už existuje v pôvodnom JAR? Tento program jednoducho vytlačí varovanie a ukončí sa. Možno by sme mohli pridať argument príkazového riadku, ktorý hovorí programu, aby používal novú hodnotu namiesto už existujúcej:

 Atribúty a = manifest.getMainAttributes (); Reťazec oldMainClass = a.putValue ("Hlavná trieda", args [1]); // Ak existuje stará hodnota, oznámte to používateľovi a ukončite if (oldMainClass! = Null) {System.out.println ("Varovanie: stará hodnota hlavnej triedy je:" + oldMainClass); System.exit (1); } 

Výstup nového JAR

Potrebujeme vytvoriť nový súbor jar, takže musíme použiť JarOutputStream trieda. Poznámka: Musíme zabezpečiť, aby sme na výstup nepoužívali rovnaký súbor ako na vstup. Prípadne by program mal zvážiť prípad, keď sú dva súbory jar rovnaké, a vyzvať používateľa, aby chcel prepísať originál. Vyhradzujem si to však ako cvičenie pre čitateľa. Ďalej s kódom!

 System.out.println ("Zápis do" + args [2] + "..."); JarOutputStream jarOut = nový JarOutputStream (nový FileOutputStream (args [2]), manifest); 

Každý vstup zo vstupného JAR do výstupného JAR musíme napísať, takže po ňom iterujte:

 // Vytvorte čítaciu vyrovnávaciu pamäť na prenos údajov zo vstupného bajtu [] buf = nový bajt [4096]; // Iterácia záznamov JarEntry záznam; while ((entry = jarIn.getNextJarEntry ())! = null) {// Vylúčte súbor manifestu zo starého JAR, ak ("META-INF / MANIFEST.MF" .equals (entry.getName ())) pokračujú; // Napíš záznam do výstupu JAR jarOut.putNextEntry (záznam); int čítať; while ((read = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, read); } jarOut.closeEntry (); } // Vyprázdnenie a zatvorenie všetkých prúdov jarOut.flush (); jarOut.close (); jarIn.close (); 

Kompletný program

Tento kód samozrejme musíme umiestniť do a hlavný metódou vo vnútri triedy as vhodnou sadou príkazov na import. Sekcia Zdroje poskytuje kompletný program.

Príklad použitia

Poďme tento program použiť s príkladom. Predpokladajme, že máte aplikáciu, ktorej hlavný vstupný bod je v triede s názvom HelloRunnableWorld. (Toto je celý názov triedy.) Predpokladajme tiež, že ste vytvorili JAR s názvom myjar.jar, ktorá obsahuje celú aplikáciu. Bež MakeJarRunnable v tomto súbore jar takto:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Ako už bolo spomenuté, opäť si všimnite, ako objednávam zoznam argumentov. Ak objednávku zabudnete, spustite tento program bez argumentov a on odpovie správou o použití.

Skúste spustiť

java -jar

povel na

myjar.jar

a potom ďalej

myjar_r.jar

. Všimnite si rozdiel! Potom to preskúmajte súbory manifestu (

META-INF / MANIFEST.MF

) v každom JAR. (Oba JAR nájdete v

zdrojový kód

.)

Tu je návrh: Skúste vytvoriť MakeJarRunnable program do spustiteľného súboru JAR!

Bežte s tým

Spustenie súboru JAR dvojitým kliknutím alebo použitím jednoduchého príkazu je vždy pohodlnejšie, ako keby ste ho museli zahrnúť do svojej cesty triedy a spustiť konkrétnu hlavnú triedu. Aby ste tomu dosiahli, špecifikácia JAR poskytuje a Hlavná trieda pre súbor manifestu JAR. Program, ktorý tu uvádzam, vám umožňuje využiť Java JAR API na ľahkú manipuláciu s týmto atribútom a na spustenie vašich súborov JAR.

Shawn Silverman je v súčasnosti postgraduálnym študentom na oddelení elektrotechniky a počítačového inžinierstva na univerzite v Manitobe v Kanade. S Java začal pracovať v polovici roku 1996 a odvtedy ho používa takmer výlučne. Medzi jeho súčasné záujmy patrí simulácia elektrických polí a tekutín, kódy na opravu chýb a implementácia šikovných trikov GUI (grafické užívateľské rozhranie). Shawn tiež vedie na treťom ročníku kurzu softvérového dizajnu na katedre počítačového inžinierstva na svojej univerzite.

Získajte viac informácií o tejto téme

  • Stiahnite si zdrojový kód a súbory JAR pre tento tip

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

  • „Java Tip 120Execute Self-Extracting JARs,“ Z. Steve Jin a John D. Mitchell (JavaWorld, Novembra 2001)

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

  • Špecifikácia súboru JAR

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

  • jar — Nástroj Java Archive Tool

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

  • Zobraziť všetky predchádzajúce Tipy pre Java a odovzdať svoje vlastné

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

  • Naučte sa Java od základu v JavaWorld 's Java 101 stĺpec

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

  • Odborníci na jazyk Java odpovedajú na vaše najťažšie otázky týkajúce sa jazyka Java v jazyku JavaWorld 's Java Q&A stĺpec

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

  • Prejdite si Core Java časť JavaWorld 's Aktuálny index

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

  • Zostaňte na vrchole našich Tipy 'N triky prihlásením sa na odber JavaWorld 's bezplatné týždenné e-mailové informačné vestníky

    //www.javaworld.com/subscribe

  • Naučte sa základy jazyka Java na strane klienta v JavaWorld 's Java začiatočník diskusia. Medzi kľúčové témy patrí jazyk Java, Java Virtual Machine, API a vývojové nástroje

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

  • Množstvo článkov týkajúcich sa IT z našich sesterských publikácií nájdete na .net

Tento príbeh, „Java Tip 127: See JAR run“, pôvodne publikoval JavaWorld.

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