Externí data v přímo spustitelných JAR


Děkuji ing. Jaroslavu Kačerovi za to, že měl dostatek trpělivosti, aby nalezl řešení a ukázal mi jej.


Chcete-li přenášet v JAR souboru, který bude spouštěn bez rozbalení, i externí data, je nutné trochu změnit zdrojový kód .java programu.

Celý trik je v tom, že např. pro natažení obrázku je možné použít jen sekvenci:

Toolkit t = Toolkit.getDefaultToolkit();
Image imgIkona = t.getImage("ikona.gif");

která funguje spolehlivě při spouštění .class souboru, ale již nefunguje při spouštění .jar souboru. Je nutné přidat jednu řádku kódu:

Toolkit t = Toolkit.getDefaultToolkit();
URL cestaKIkone = getClass().getResource("ikona.gif");
Image imgIkona = t.getImage(
cestaKIkone);

Pak již vše funguje podle předpokladů.

Zde je na ukázku celý zdrojový kód. (Nekamenujte mne, prosím, za používání magických čísel. Snažil jsem se o co nejkratší kód.)
V programu se načítají dva externí obrázky -- první je ikona na liště, druhý obrázek kočky na ploše.

Na následujícím obrázku vidíte, jak vše funguje při spuštění z .class souboru.

Stejně to funguje i po zabalení (v souboru zabaleny.jar je i zdrojový kód) a spuštění bez rozbalení. Soubor pomocny.txt slouží jen pro přípravu souboru Manifestu.