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 (https://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ě.
Poslední komentáře