Programování

Tip pro Javu 127: Viz spuštění JAR

Můžete snadno zabalit celou sadu tříd a prostředků aplikace do archivu Java (JAR). Ve skutečnosti je to jeden cíl mít soubory jar. Další možností je umožnit uživatelům snadno spustit aplikaci uloženou v archivu. Proč tedy soubory jar jsou občany druhé třídy ve vesmíru Java - fungují pouze jako archivy - když mohou být první třídou, hned vedle nativních spustitelných souborů?

Chcete-li spustit soubor jar, můžete použít

Jáva

velení

-sklenice

volba. Řekněme například, že máte spustitelný soubor jar s názvem

myjar.jar

. Protože je soubor spustitelný, můžete jej spustit takto:

java -jar myjar.jar

.

Alternativně prostředí Java Runtime Environment (JRE), pokud je nainstalováno v operačním systému, jako je Microsoft Windows, přidruží soubory jar s JVM, takže na ně můžete poklepáním spustit aplikaci. Tyto soubory JAR musí být spustitelné.

Otázka zní: Jak nastavíte spustitelný soubor JAR?

Soubor manifestu a položka hlavní třídy

Ve většině souborů JAR je soubor s názvem

MANIFEST.MF

je uložen v adresáři s názvem

META-INF

. Uvnitř tohoto souboru byla vyvolána speciální položka

Hlavní třída

říká

java -jar

příkaz, kterou třídu provést.

Problém je v tom, že tuto speciální položku musíte správně přidat do souboru manifestu sami - musí jít na určitém místě a musí mít určitý formát. Někteří z nás však nemají rádi úpravy konfiguračních souborů.

Nechte to API udělat za vás

Vzhledem k tomu, Java 1.2, balíček s názvem java.util.jar vám umožní pracovat se soubory jar. (Poznámka: Navazuje na java.util.zip Konkrétně balíček jar vám umožní snadno manipulovat s tímto zvláštním souborem manifestu pomocí Manifest třída.

Pojďme napsat program, který používá toto API. Nejprve musí tento program vědět o třech věcech:

  1. JAR, který chceme spustit
  2. Hlavní třída, kterou chceme provést (tato třída musí existovat uvnitř JAR)
  3. Název nového JAR pro náš výstup, protože bychom neměli jednoduše přepisovat soubory

Napište program

Výše uvedený seznam bude představovat argumenty našeho programu. V tomto okamžiku si vybereme vhodný název pro tuto aplikaci. Jak MakeJarRunnable zvuk?

Zkontrolujte argumenty main

Předpokládejme, že náš hlavní vstupní bod je standard main (Řetězec []) metoda. Nejprve bychom měli zkontrolovat argumenty programu zde:

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

Věnujte pozornost způsobu interpretace seznamu argumentů, protože je to důležité pro následující kód. Pořadí a obsah argumentů nejsou vytesány do kamene; Nezapomeňte však vhodně upravit druhý kód, pokud je změníte.

Otevřete soubor JAR a jeho manifest

Nejprve musíme vytvořit některé objekty, které vědí o souborech JAR a manifestech:

 // Vytvořte objekt JarInputStream a získejte jeho manifest JarInputStream jarIn = nový JarInputStream (nový FileInputStream (args [0])); Manifest manifest = jarIn.getManifest (); if (manifest == null) {// Stane se to, pokud neexistuje žádný manifest manifest = new Manifest (); } 

Nastavte atribut Main-Class

Dali jsme Hlavní třída položka v sekci hlavních atributů souboru manifestu. Jakmile získáme tuto sadu atributů z objektu manifestu, můžeme nastavit příslušnou hlavní třídu. Ale co když a Hlavní třída atribut již existuje v původním JAR? Tento program jednoduše vytiskne varování a ukončí se. Možná bychom mohli přidat argument příkazového řádku, který říká programu, aby použil novou hodnotu namísto již existující:

 Atributy a = manifest.getMainAttributes (); Řetězec oldMainClass = a.putValue ("Hlavní třída", args [1]); // Pokud existuje stará hodnota, řekněte to uživateli a ukončete if (oldMainClass! = Null) {System.out.println ("Varování: stará hodnota hlavní třídy je:" + oldMainClass); System.exit (1); } 

Výstup nového JAR

Musíme vytvořit nový soubor jar, takže musíme použít JarOutputStream třída. Poznámka: Musíme zajistit, abychom pro výstup nepoužívali stejný soubor jako pro vstup. Alternativně by program měl zvážit případ, kdy jsou dva soubory jar stejné, a vyzvat uživatele, pokud chce přepsat originál. Vyhrazuji si to však jako cvičení pro čtenáře. Zapnuto s kódem!

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

Musíme zapsat každou položku ze vstupního JAR do výstupního JAR, takže iterujte nad položkami:

 // Vytvořit čtecí vyrovnávací paměť pro přenos dat ze vstupního bajtu [] buf = nový bajt [4096]; // Iterace záznamů JarEntry záznam; while ((entry = jarIn.getNextJarEntry ())! = null) {// Vyloučit soubor manifestu ze starého JAR, pokud ("META-INF / MANIFEST.MF" .equals (entry.getName ())) pokračovat; // Napiš záznam na výstup JAR jarOut.putNextEntry (záznam); int čtení; while ((read = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, read); } jarOut.closeEntry (); } // Vyprázdnění a zavření všech proudů jarOut.flush (); jarOut.close (); jarIn.close (); 

Kompletní program

Tento kód samozřejmě musíme umístit do a hlavní metoda uvnitř třídy a s vhodnou sadou příkazů importu. Sekce Zdroje poskytuje kompletní program.

Příklad použití

Pojďme tento program použít s příkladem. Předpokládejme, že máte aplikaci, jejíž hlavní vstupní bod je ve třídě s názvem HelloRunnableWorld. (Toto je celé jméno třídy.) Předpokládejme také, že jste vytvořili JAR s názvem myjar.jarobsahující celou aplikaci. Běh MakeJarRunnable v tomto souboru jar takto:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Jak již bylo zmíněno dříve, všimněte si, jak objednávám seznam argumentů. Pokud objednávku zapomenete, spusťte tento program bez argumentů a bude reagovat zprávou o použití.

Zkuste spustit

java -jar

povel zapnut

myjar.jar

a pak dál

myjar_r.jar

. Všimněte si rozdílu! Poté proveďte prozkoumání souborů manifestu (

META-INF / MANIFEST.MF

) v každém JAR. (Oba JAR najdete v

zdrojový kód

.)

Tady je návrh: Zkuste vytvořit MakeJarRunnable program do spustitelného JAR!

Běžte s tím

Spuštění JAR poklepáním na něj nebo pomocí jednoduchého příkazu je vždy pohodlnější, než když jej musíte zahrnout do své cesty ke třídě a spustit konkrétní hlavní třídu. Abychom vám s tím pomohli, specifikace JAR poskytuje a Hlavní třída atribut pro soubor manifestu JAR. Program, který zde představuji, vám umožní využít JAR API Java pro snadnou manipulaci s tímto atributem a pro spuštění vašich JAR.

Shawn Silverman je v současné době postgraduální student na katedře elektrotechniky a výpočetní techniky na University of Manitoba v Kanadě. S Javou začal pracovat v polovině roku 1996 a od té doby ji používá téměř výhradně. Mezi jeho současné zájmy patří simulace elektrických polí a tekutin, kódy opravující chyby a implementace šikovných triků GUI (grafické uživatelské rozhraní). Shawn také vyučuje třetí ročník kurzu softwarového designu na katedře počítačového inženýrství na své univerzitě.

Další informace o tomto tématu

  • Stáhněte si zdrojový kód a soubory JAR pro tento tip

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

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

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

  • Specifikace souboru 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

  • Zobrazit všechny předchozí Tipy pro Java a odešlete vlastní

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

  • Naučte se Java od základu v JavaWorld 's Java 101 sloupec

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

  • Odborníci na jazyk Java odpovídají na vaše nejnáročnější otázky týkající se jazyka Java v JavaWorld 's Java Q&A sloupec

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

  • Procházejte Core Java část JavaWorld 's Aktuální rejstřík

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

  • Zůstaňte nad námi Tipy 'N triky přihlášením k odběru JavaWorld 's týdenní e-mailové zpravodaje zdarma

    //www.javaworld.com/subscribe

  • Naučte se základy jazyka Java na straně klienta JavaWorld 's Java začátečník diskuse. Mezi hlavní témata patří jazyk Java, virtuální stroj Java, rozhraní API a vývojové nástroje

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

  • Spoustu článků o IT z našich sesterských publikací najdete na .net

Tento příběh, „Java Tip 127: See JAR run“, původně publikoval JavaWorld.

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