Java 9: czy mogę stworzyć z mojej aplikacji binarkę?
Jakie mam opcje?
Chcę dać komuś mój programik. Nie mam pewności, czy ma zainstalowaną odpowiednią (tj. pozwalającą na uruchomienie mojego jara) wersję JRE. Myślę, że nie potrafi / nie chce / nie ma możliwości jej zainstalowania. Co mogę zrobić? Jak sobie poradzić?
Jako programista mogę przygotować temu komuś jeden plik - uruchamialnego jara. Do uruchomienia będzie oczywiście potrzebna zainstalowana w systemie Java (JRE) w wersji co najmniej takiej, jakiej użyłampodczas kompilacji (zależnie od opcji -source i -target).
Mogę też użyć istniejącyh “bundlerów”, które mogą utworzyć “instalator”, zawierający, oprócz mojego kodu, również cały Java Runtime Environment ważący około 300MB. Wady takiego rozwiązania są oczywiste:
- paczka, którą dostarczę, będzie bardzo ciężka
- uzależniam się od dostawcy “bundlera”, polegam na czyimś kodzie
Jak Java 9 rozwiązuje ten problem
Modularyzacja wprowadzona w Java 9 nie tylko umożliwia pisanie aplikacji modularnych. Oferuje również możliwość uwtorzenia dystrybucji aplikacji wraz ze środowskiem uruchomieniowym (JRE) ograniczonym wyłącznie do tych modułów biblioteki standardowej, z których rzeczywiście aplikacja korzysta.
Jak zrobić własną dystrybucję aplikacji
Aby stworzyć własną dystrybucję mojej aplikacji, użyję narzędzia jlink
. Utworzy ono paczkę zawierającą:
- skompilowany kod mojej aplikacji
- środowisko uruchomieniowe (“minimalne”, czyli ograniczone do modułów, z których korzysta moja aplikacja)
- skrypt uruchamiający aplikację (zależnie od systemu, skrypt bashowy w Linuksie albo batch dla Windowsa) przy pomocy “minimalnego” środowiska uruchomieniowego
Więcej o narzędziu jlink można przeczytać tutaj.
Moja pierwsza aplikacja
|
|
Używam po kolei takich opcji:
--module-path mlib
- wskazuję ścieżkę do katalogu z modułami--add-modules client,api,generator
- określam listę modułów mojej aplikacji--output image
- ustalam katalog docelowy, gdzie będą pliki dystrybucji--launcher cli=client/com.kamilachyla.Main
- definiuję nazwę (cli
) skryptu uruchomieniowego oraz klasę główną wraz z nazwą modułu--no-man-pages
- nie chcę generowania podręcznika man--no-header-files
- nie potrzebuję plików nagłówkowych C--compress 2
- chcę kompresować zasoby algorytmem ZIP--strip-debug
- nie potrzebuję symboli do debagowania
Wielkość katalogu z dystrybucją aplikacji
Katalog image
ma wielkość 33M (jvm javy 14 to 438M).
|
|
Uruchomienie
Uruchamiam skrypt startowy w image/bin/cli
- wszystko śmiga.∎
|
|
Źródła
Ship zero-dependency native app
Podobne artykuły
Mogą Cię również zainteresować:
Ten wpis jest częścią serii java.
- 2021-09-12 - Java 18: co nowego? - przegląd JEP-ów
- 2021-21-09 - Java 17 - RandomGenerator i spółka
- 2021-15-09 - Java 17 - co nowego?
- 2021-04-03 - Java 15 - czym są sealed classes?
- 2021-26-02 - Java 13 i 14: Bloki tekstowe i rekordy
- 2021-24-02 - Java 12 - wyrażenie switch (preview feature)
- 2021-23-02 - Java 11 - HTTP Client i uruchamianie jednoplikowych programów
- 2021-18-02 - Java 9 - co to jest JShell i dlaczego warto używać REPL-a w Javie
- 2021-12-02 - Java 10 - var, nowe metody w Optional, kolekcje "unmodifiable"
- 2021-11-02 - Java 9 - nowości w bibliotece
- 2021-10-02 - Java 9: czy mogę stworzyć z mojej aplikacji binarkę?
- 2021-10-02 - Java 9: praktyczny przykład - trzy moduły
- 2021-08-02 - Java 8: praktyczny przykład - przewidywanie kolejnej daty w serii