Multiplatformový spustenie Java aplikácií
V tomto tutoriále si predstavíme spôsob, ako vylepšiť spustenie Java aplikácií.
Motivácia
Pokiaľ si aplikáciu píšete len pre seba, tak sa jej spustením nemusíte vôbec zaťažovať. V opačnom prípade, ak nepoužijete nejaký spúšťací skript a užívateľ nemá nainštalovanú Javu, tak sa mu vaša aplikácia môže pokojne otvoriť ako archív. To nie je práve žiaduce stav. So skriptom sa vám to nestane. Tiež môžete zaistiť, že sa používateľom aplikácie spustí s prepínačmi (napríklad pre kódovanie), ktoré potrebujete. Ako však vyriešiť, aby jediný skript fungoval na Windows i Linuxe?
Najprv si predvedieme jednoduchý skript, ktorý pustí jar súbor na Windows i na Linuxe. Pomocou hack nám bude naozaj stačiť pre oba operačné systémy jediný súbor. Popíšeme si, ako sa dá rozšíriť, a nakoniec je zaradený aj generátor tohto skriptu.
Poznámka: pôvodnej verzii skript vymyslel môj kolega a článok vznikol s jeho láskavým dovolením. Originál nájdete tu: github.com
Skript
Ako pravdepodobne viete, skripty pre Windows a Linux sa značne líšia. Ako
teda urobiť univerzálny skript pre oba operačné systémy? Pozor si musíme
dať najmä na konce riadkov, kde na Windows používame sekvenciu znakov
\r\n
a na Linuxe iba \n
. V nasledujúcej ukážke je
najjednoduchšia verzia skriptu bez ďalších rozšírení. Prázdne riadky v
ukážke sú len pre čitateľnosť:
#!/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 predchádzajúcej ukážke sme pre názornosť uviedli aj
znaky pre nový riadok, ktoré by normálne neboli vidieť. V ďalších
ukážkach je už uvádzať nebudeme. Proste všetko, čo bude medzi
# Linux
a exit
, respektíve medzi
:Windows
a exit
, bude končiť rovnakým typom konca
riadku, akým končí predchádzajúci riadok.
Ako skript spracuje Windows
Príkazový riadok Windows príde na prvý riadok, ten nevie vykonať, tak prejde na druhý. Tomu už rozumie a vykoná ho. Tým preskočí časť pre Linux a pustí vybraný jar. Následne zavrie okno príkazového riadku.
Ako skript spracuje Linux
Tu terminál vie spracovať prvý riadok, ale u druhého vypíše chybu a prejde na tretí. Potom spustí daný jar a terminál zavrie.
Rozšírenie
Skript môžeme pre maximálne pohodlie nášho užívateľa ešte rozšíriť.
Znaková sada a ostatné prepínače
Nasledujúce rozšírenie skriptu o nastavení znakovej sady oceníte
obzvlášť, ak používate v aplikácii slovenčinu:
-Dfile.encoding
, najčastejšie -Dfile.encoding=UTF8
.
Použitie vo skriptu je nasledujúci:
#!/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 nastaviť všetky ďalšie prepínače. Ich zoznam nájdete
pomocou java -help
.
Nainštalovaná Java
Ako sme si už hovorili v úvode, nikdy neviete, na akom PC bude vaša
aplikácia spustená a či tu bude nainštalovaná Java. Najprv sa teda zavolá
príkaz pre vypísanie verzie Javy a ak je návratový kód 0
(všetko prebehlo bez problémov), je Java nainštalovaná. Ak nainštalovaná
nie je, vypíše sa 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
Vyššie uvedený skript samozrejme môžete značne vylepšiť, ak namiesto
vypísanie hlášky pri neexistencii Javy vyvoláte nejaké modálne okno alebo
spustíte vlastný skript pre inštaláciu Javy. Tiež môžete výsledok
java -version
parsovať a kontrolovať, či je nainštalovaná tá
verzia Javy, ktorú potrebujete.
Generátor skriptu
Veľkou nevýhodou skriptu vyššie je, že málo textových editorov pre
Windows vie napísať nový riadok Linuxu a opačne. Našťastie to Java môže
urobiť za nás. Preto si teraz vytvoríme jednoduchý generátor tohto skriptu.
Ako parameter bude brať meno .jar
súboru:
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]); } }
Ako vidíte, generátor možno spustiť z príkazového riadku, kde pridáme
parameter - meno vašej aplikácie. V prílohe je k dispozícii zdrojový kód
tohto skriptu, vyexportovaný generátor a ešte jeden jar -
test.jar
, veľmi jednoduchá aplikácia na testovanie funkčnosti
skriptu.
Ukážka použitia generátora
Použitie vyexportovaného generátora je pri použití jari z prílohy nasledujúce:
Linux
java -jar ./run_generator.jar test.jar
Windows
start javaw -jar ./run_generator.jar test.jar
Vytvorený súbor run.bat
odporúčam
needitovat v bežných editoroch. Ak výsledný skript na
jednom os vyeditujete, editor vám pravdepodobne upraví aj konce riadkov a
skript pravdepodobne (v závislosti na editore) nepôjde použiť na druhom
OS.
Záverom
Pokiaľ budú užívatelia pre spúšťanie vašich Java aplikácií používať tento skript, znížite riziko problémov so znakovou sadou alebo problémov s nenainštalovanú Javou.
Ak by niekto z vás mal nápad na vylepšenie funkcionality ako napríklad rozlišovanie Windows, Linux a Mac, skripty pre parsovanie verzie Javy, skript pre vypísanie hlášky o neexistencii Javy alebo spustenie jej inštalácia, pošlite do komentárov odkaz alebo kód a ja ho včlenením do tohto článku .
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 9x (17.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java