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:
- JAR, který chceme spustit
- Hlavní třída, kterou chceme provést (tato třída musí existovat uvnitř JAR)
- 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.jar
obsahují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.
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/[email protected]@.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.