Jak vytvořit jar soubor

Než začnu popisovat postup na vytvoření jar souboru, rád bych trošku objasnil detaily tohoto typu souboru. Jar soubor je jen obyčejný ZIP archív (jar znamená Java Archive), který slouží ke snadnější distribuci Java class souborů. Dále může obsahovat soubor s metadaty, které určujou některé parametry balíku. No a vzhledem k tomu, že se jedná o klasický archív, může obsahovat i cokoliv jiného – např. grafiku, audio a podobně.

Pokud je v manifestu uveden Main-Class parametr, je jar soubor spustitelný. Buď klasickým poklepáním na soubor (pokud je dobře nastavena asociace v systému), nebo pomocí příkazu java -jar soubor.jar, kde soubor.jar je název souboru.

Metadata jsou v archívu uloženy v souboru META-INF/MANIFEST.MF. Jedná se o klasický textový soubor, který můžete editovat i ručně. Kompletní výčet informací, které můžete do manifestu uložit najdete přímo ve specifikaci. Pro začátek bude stačit, když budete znát význam těchto atributů:

  • Main-Class : Pokud chcete, aby byl jar soubor spustitelný, musíte do souboru MANIFEST.MF zapsat tento atribut, za kterým následuje cesta ke class souboru uvnitř balíku.
  • Class-Path : Tento atribut je velmi důležitý. Pokud totiž vaše aplikace používá nějaké další knihovny, musíte uvést do Class-Path atributu cestu k těmto knihovnám. Cesty jsou oddělené mezerami.

Myslím si, že další atributy nejsou pro začátek tolik důležité a jejich význam už si můžete snadno dohledat ve specifikaci. Když už víte, jak jar soubory přibližně fungují, určitě vás napadne způsob jak jar soubor vytvořit. Můžete jednoduše zabalit adresář s class soubory a do archívu vložit manifest soubor. Jenže kdo by se s tím měl takhle trápit. Existují mnohem jednodušší způsoby.

Díky Antu to jde snadno

ant_logo_largeAnt je pro Java vývojáře velmi užitečný nástroj. Díky němu můžete urychlit a zautomatizovat některé jinak zdlouhavé operace. Pro jednoduchost uvedu tento případ: máme Java projekt, který obsahuje několik souborů. Hlavní třída, kterou chceme aplikaci spouštět se bude jmenovat Hlavni. Musím připomenout, že aby tato třída byla spustitelná, musí mít metodu public static void main(final String[] args).Vytvoříme si tedy soubor build.xml, do kterého budeme přidávat úlohy pro ant.

Začneme s definováním některých atributů, ve kterých definujeme cesty k adresářům a název výsledného jar souboru.

<property name="srcdir" location="./src" />
<property name="bindir" location="./bin" />
<property name="deploydir" location="./deploy" />
<property name="jarname" value="Aplikace.jar" />
<property name="mainclass" value="Hlavni" />

Vytvoříme první target, který nám zkompiluje všechny .java soubory z adresáře ./src a výsledné .class soubory uloží do adresáře ./bin. Samozřejmě, že adresářová struktura se zachová.

<target name="compile">
    <javac srcdir="${srcdir}" destdir="${bindir}" />
</target>

Nyní máme zkompilované class soubory a můžeme se vrhnout na vytvoření jar souboru. Pro tento účel vytvoříme další target.

<target name="createJar" depends="compile">
    <jar destfile="${deploydir}/${jarname}">
        <fileset dir="${bindir}"/>
        <manifest>
            <attribute name="Main-Class" value="${mainclass}"/>
        </manifest>
    </jar>
</target>

Target createJar závisí na compile, takže se nejdříve zkompilují java soubory a teprve poté se z class souborů vytvoří jar soubor. Do tohoto souboru se vloží obsah složky ./bin a vytvoří se META-INF/MANIFEST.MF se správně nastaveným atributem Main-Class. Díky tomu bude tento jar soubor spustitelný. Pro pořádek ještě uvedu obsah celého build.xml souboru:

< ?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="createJar" basedir="../">
    <property name="srcdir" location="./src" />
    <property name="bindir" location="./bin" />
    <property name="deploydir" location="./deploy" />
    <property name="jarname" value="Aplikace.jar" />
    <property name="mainclass" value="Hlavni" />
 
    <target name="compile">
        <javac srcdir="${srcdir}" destdir="${bindir}" />
    </target>
 
    <target name="createJar" depends="compile">
        <jar destfile="${deploydir}/${jarname}">
            <fileset dir="${bindir}"/>
            <manifest>
                <attribute name="Main-Class" value="${mainclass}"/>
            </manifest>
        </jar>
    </target>
</project>

Spouštíme Ant

Buildovací skript máme napsaný, takže teď už jen stačí spustit ant z adresáře, kde máte build.xml soubor uložený. Pro zjednodušení si můžete vytvořit soubor antbuild.cmd, který editujte v textovém editoru a vložte do něj tyto řádky:

call ant
call pause

Poté stačí antbuild.cmd spustit, a vaše aplikace se zkompiluje a vytvoří se jar soubor. Pokud vám příkazový řádek bude hlásit, že nezná příkaz ant, tak si budete muset Ant stáhnout (z této adresy) a nastavit k němu cestu v Enviroment variables (česky Proměnné prostředí). Vzhledem k tomu, že na každém systému se toto nastavuje jinak, doporučuju do Googlu zadat výraz “how to set environment variable on X”, kde za X dosadíte název vašeho systému.

S Eclipsem ještě jednodušeji

Pokud používáte Eclipse, můžete ant scripty spouštět ještě snadněji přímo z IDE. Stačí na soubor build.xml kliknout pravým tlačítkem a vybrat Run as -> Ant build. Vzhledem k tomu, že Eclipse už v základu obsahuje Ant, nebudete muset nic stahovat, ani nastavovat.

Proč Ant?

Většina IDE umožňuje export do jar souboru. Problém je, že takový postup nelze plně automatizovat a člověk přitom může udělat chyby. Když budete jar soubory generovat pomocí Antu, budete mít jistotu, že všechno probíhá tak, jak si přejete. Navíc při změně IDE nemusíte zdlouhavě řešit, jak se jar vytváří jinde. Stačí spustit Ant a máte po problémech.

Malé doplnění

Na začátku jsem se zmínil o atributu Class-Path, který může být vložen do manifest souboru. O tom, jak tento atribut vygenerovat pomocí Antu jsem již jednou psal v tomto článku. Považuji tedy za zbytečné se o tom znovu zmiňovat.

Příspěvek byl publikován v rubrice Programování. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

2 reakce na Jak vytvořit jar soubor

  1. don pedro spadl do louže napsal:

    celkem jednoduše a chytře popsáno

  2. miranda napsal:

    frčí docela klikačky…co takhle vymyslet JAVA hru na klikačku od Neobuxu…:)budem si hrát a ještě vydělávat…nejlepší by byla odklikávání červených kuliček, zabírám si první vydání aplikace v *.jar 🙂

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *