IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 8x (17.67 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Všechny články v sekci
Kompilace manuálně v Javě
Článek pro vás napsal Ondřej Němec
Avatar
Uživatelské hodnocení:
1 hlasů
Aktivity