Multiplatformní spuštění Java aplikací
V tomto tutoriálu si představíme způsob, jak vylepšit spuštění Java aplikací.
Motivace
Pokud si aplikaci píšete jen pro sebe, tak se jejím spuštěním nemusíte vůbec zatěžovat. V opačném případě, pokud nepoužijete nějaký spouštěcí skript a uživatel nemá nainstalovanou Javu, tak se mu vaše aplikace může klidně otevřít jako archiv. To není zrovna žádoucí stav. Se skriptem se vám to nestane. Také můžete zajistit, že se uživatelům aplikace spustí s přepínači (například pro kódování), které potřebujete. Jak ale vyřešit, aby jediný skript fungoval na Windows i Linuxu?
Nejprve si předvedeme jednoduchý skript, který pustí jar soubor na Windowsech i na Linuxu. Pomocí hacků nám bude opravdu stačit pro oba operační systémy jediný soubor. Popíšeme si, jak se dá rozšířit, a nakonec je zařazen i generátor tohoto skriptu.
Poznámka: původní verzi skript vymyslel můj kolega a článek vznikl s jeho laskavým svolením. Originál naleznete zde: github.com
Skript
Jak pravděpodobně víte, skripty pro Windows a Linux se značně liší.
Jak tedy udělat univerzální skript pro oba operační systémy? Pozor si
musíme dát zejména na konce řádků, kde na Windows používáme sekvenci
znaků \r\n
a na Linuxu pouze \n
. V následující
ukázce je nejjednodušší verze skriptu bez dalších rozšíření. Prázdné
řádky v ukázce jsou jen pro čitelnost:
#!/bin/bash\n\r\n GOTO Windows\r\n # Linux\n java -jar ./file-name.jar\n exit\n\r\n :Windows\r\n start javaw -jar ./file-name.jar\r\n exit
V předchozí ukázce jsme pro názornost uvedli i znaky pro
nový řádek, které by normálně nebyly vidět. V dalších ukázkách je
již uvádět nebudeme. Prostě vše, co bude mezi # Linux
a
exit
, respektive mezi :Windows
a exit
,
bude končit stejným typem konce řádku, jakým končí předchozí
řádek.
Jak skript zpracuje Windows
Příkazový řádek Windows přijde na první řádek, ten neumí vykonat, tak přejde na druhý. Tomu už rozumí a vykoná jej. Tím přeskočí část pro Linux a pustí vybraný jar. Následně zavře okno příkazového řádku.
Jak skript zpracuje Linux
Zde terminál umí zpracovat první řádek, ale u druhého vypíše chybu a přejde na třetí. Pak spustí daný jar a terminál zavře.
Rozšíření
Skript můžeme pro maximální pohodlí našeho uživatele ještě rozšířit.
Znaková sada a ostatní přepínače
Následující rozšíření skriptu o nastavení znakové sady oceníte
zvláště, pokud používáte v aplikaci češtinu:
-Dfile.encoding
, nejčastěji -Dfile.encoding=UTF8
.
Použití ve skriptu je následující:
#!/bin/bash GOTO Windows # Linux java -Dfile.encoding -jar ./file-name.jar exit :Windows start javaw -Dfile.encoding -jar ./file-name.jar exit
Takto si můžete nastavit všechny další přepínače. Jejich seznam
najdete pomocí java -help
.
Nainstalovaná Java
Jak jsme si již říkali v úvodu, nikdy nevíte, na jakém PC bude vaše
aplikace spuštěna a jestli zde bude nainstalovaná Java. Nejprve se tedy
zavolá příkaz pro vypsání verze Javy a pokud je návratový kód
0
(vše proběhlo bez problémů), je Java nainstalovaná. Pokud
nainstalovaná není, vypíše se hláška "You must install java first".
#!/bin/bash GOTO Windows # Linux java -version if [ $? -eq 0 ]; then java -jar ./file-name.jar else echo You must install java first fi exit :Windows java -version IF %errorlevel% EQU 0 ( start javaw -jar ./file-name.jar ) ELSE ( echo You must install java first ) exit
Výše uvedený skript samozřejmě můžete značně vylepšit, pokud místo
vypsání hlášky při neexistenci Javy vyvoláte nějaké modální okno nebo
spustíte vlastní skript pro instalaci Javy. Také můžete výsledek
java -version
parsovat a kontrolovat, zda je nainstalovaná ta
verze Javy, kterou potřebujete.
Generátor skriptu
Velkou nevýhodou skriptu výše je, že málo textových editorů pro
Windows umí napsat nový řádek Linuxu a opačně. Naštěstí to Java může
udělat za nás. Proto si teď vytvoříme jednoduchý generátor tohoto
skriptu. Jako parametr bude brát jméno .jar
souboru:
package generator; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class RunnerGenerate { private String win = "\r\n"; private String linux = "\n"; public RunnerGenerate(final String jarFile) { try(BufferedWriter br = new BufferedWriter(new FileWriter("run.bat"))) { br.write( "#!/bin/bash" + linux + win + "GOTO Windows" + win + "# Linux" + linux + "java -version" + linux + "if [ $? -eq 0 ]; then" + linux + " java -Dfile.encoding=UTF8 -jar ./" + jarFile + linux + "else" + linux + " echo You must install java first" + linux + "fi" + linux + "exit" + linux + win + ":Windows" + win + "java -version" + win + "IF %errorlevel% EQU 0 (" + win + " start javaw -Dfile.encoding=UTF8 -jar ./" + jarFile + win + ") ELSE (" + win + " echo You must install java first" + win + ")" + win + "exit" ); System.out.println("completed"); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new RunnerGenerate(args[0]); } }
Jak vidíte, generátor lze spustit z příkazové řádky, kde přidáme
parametr - jméno vaší aplikace. V příloze je k dispozici zdrojový kód
tohoto skriptu, vyexportovaný generátor a ještě jeden jar -
test.jar
, velmi jednoduchá aplikace k testování funkčnosti
skriptu.
Ukázka použití generátoru
Použití vyexportovaného generátoru je při použití jarů z přílohy následující:
Linux
java -jar ./run_generator.jar test.jar
Windows
start javaw -jar ./run_generator.jar test.jar
Vytvořený soubor run.bat
doporučuji
needitovat v běžných editorech. Pokud výsledný skript na
jednom os vyeditujete, editor vám pravděpodobně upraví i konce řádků a
skript pravděpodobně (v závislosti na editoru) nepůjde použít na druhém
OS.
Závěrem
Pokud budou uživatelé pro spouštění vašich Java aplikací používat tento skript, snížíte riziko problémů se znakovou sadou nebo problémů s nenainstalovanou Javou.
Pokud by někdo z vás měl nápad na vylepšení funkcionality jako například rozlišování Windows, Linux a Mac, skripty pro parsování verze Javy, skript pro vypsání hlášky o neexistenci Javy nebo spuštění její instalace, pošlete do komentářů odkaz nebo kód a já jej začlením do tohoto článku.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 9x (17.67 kB)
Aplikace je včetně zdrojových kódů v jazyce Java