Na jednom z našich projektů jsme potřebovali vytvořit spustitelný exe soubor, jako alternativu ke spouštění projektu klasicky přes jar soubor. Jak tento problém vyřešit s co nejmenší námahou se dočtete v následujícím článku.

K tomu abychom vytvořili spustitelný exe souboru z klasického java projektu existuje nespočet možností. Pro naše potřeby nám vyhovuje již osvědčený projekt Launch4j (http://launch4j.sourceforge.net/), který je navíc dostupný zdarma. Jeho výhodou je, že nabízí velké možnosti nastavení, automatické vyhledání JVM dané verze, dovoluje použít například splash obrázek a hlavně umožňuje nastavení libovolného jména procesu (důležité pro případnou identifikaci procesu v seznamu procesů ve Windows – klasický Java proces má jméno java či javaw). Pracuje na bázi wrapperu – tedy obalí váš jar soubor a spustí ho. Jar soubor pak může být zabalený přímo v exe souboru, nebo může existovat v externím adresáři, kde si ho daný exe soubor najde a spustí. Launch4j obsahuje vlastní GUI, kde lze vše nastavit a exe soubory vytvářet. Více informací najdete na stránkách projektu – v tomto článku se bude zabývat především možností automatického buildu do exe souboru pomocí Mavenu.

K tomu, abychom mohli plugin do Mavenu používat, je třeba přidat do pom.xml následující závislost:


<dependency>
<groupid>org.bluestemsoftware.open.maven.plugin</groupid>
<artifactid>launch4j-plugin</artifactid>
<version>1.0.0.2</version>
</dependency>

Plugin v sobě obsahuje vše potřebné, tedy i samotný Launch4j, tudíž nic více není třeba. Dále nám pak stačí přidat následující definici pluginu do build sekce pom.xml (exe se vytváří ve fázi package – mvn package):


<plugin>
<groupid>org.bluestemsoftware.open.maven.plugin</groupid>
<artifactid>launch4j-plugin</artifactid>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headertype>gui</headertype>
<outfile>target/jmeno_exe_souboru.exe</outfile>
<jar>target/jmeno_jar_souboru.jar</jar>
<dontwrapjar>false</dontwrapjar>
<stayalive>true</stayalive>
<customprocname>true</customprocname>
<classpath>
<mainclass>cz.morosystems.Main</mainclass>
<adddependencies>true</adddependencies>
<jarlocation>%EXEDIR%\lib</jarlocation>
<precp>lib\dodatecna_zavislost.jar</precp>
</classpath>
<jre>
<minversion>1.5.0</minversion>
</jre>
<versioninfo>
<fileversion>1.0.0.0</fileversion>
<productversion>1.0.0.0</productversion>
<originalfilename>jmeno_souboru.exe</originalfilename>
</versioninfo>
<splash>
<file>jmeno_obrazku.bmp</file>
<waitforwindow>true</waitforwindow>
<timeout>10</timeout>
<timeouterr>false</timeouterr>
</splash>
</configuration>
</execution>
</executions>
</plugin>


Co tedy v tomto nastavení děláme a co lze zde nastavit (nejdůležitější body – ostatní je zřejmé):

  • headerType – nastavuje, jestli se jar pustí pomocí javaw.exe (gui) či java.exe (console)
  • outfile – jméno výstupního souboru
  • jar – jméno jar souboru, který bude použit k spouštění
  • dontWrapJar – nastavuje, zda-li bude jar souboru zabalen do exe souboru, či bude spouštěn externě
  • stayAlive – určuje, zda-li se exe proces ukončí po spuštění java procesu
  • customProcName – určuje, zda-li chceme, aby měl proces vlastní jméno (dle jména exe souboru)
  • classpath – zde se nastavuje main class, pro správné spuštění jar souboru; poté zda-li má plugin přidat při suštění do classpath všechny závislosti z Mavenu (addDependencies); následuje upřesnění umístění všech závislostí (jarLocation), kde lze použít relativní cestu k exe souboru (%EXEDIR%) a jiné proměnné (více viz. stránky projektu); v tagu preCp (připadně postCp) lze nastavovat dodatečné závislosti, které nekontroluje Maven – pre přidá závislosti před ty automaticky přidané, post poté za závislosti
  • jre – nastavuje verzi JVM, kterou má launch4j použít – jde definovat jak min, tak max
  • versionInfo – upravuje informace o exe souboru (verze, popis, copyright a další)
  • splash – umožňuje zobrazit splash okno před samotným spuštěním aplikace; nastavuje se zde cesta k souboru (file), poté zda-li se má splash okno uzavřít ihned po zobrazení okna aplikace (waitForWindow); timeout nastavuje dobu, za kterou se splash okno zavře (pokud se neotevře aplikační okno) a nakonec timeoutErr nastavuje zda-li se má zobrazit chybová hláška, když je splash okno zavřené pomocí timeoutu

Jak můžete vidět, samotný Launch4j a jeho Maven plugin dokáží ušetřit spoustu práce a možnosti jejich nastavení jsou opravdu ohromující – jejich kompletní popis naleznete na stránkách projektu.

Doufáme, že vám tento článek pomůže při řešení tak atypického problému, jako je vytváření exe souborů v Javě.