Java 9 wprowadziła ideę modularnych obrazów środowiska uruchomieniowego w Project Jigsaw i oficjalnie rozwiązała problem dostarczania środowiska wykonawczego Java jako monolitycznych artefaktów. Monolityczne obrazy uruchomieniowe nie tylko obciążały pamięć, ale także obniżały ogólną wydajność działającej na nich aplikacji. Teraz możemy spakować dostosowany podzbiór JRE, w oparciu o indywidualne potrzeby aplikacji, które na nim działają i zwiększyć ich wydajność. Ten artykuł zawiera całościowe spojrzenie na tę funkcję niestandardowych obrazów środowiska wykonawczego wprowadzoną w Javie 9.
Przegląd
Wpływ idei stworzenia modularnego obrazu środowiska uruchomieniowego w Javie 9 jest ogromny. Otwiera drzwi do niestandardowej aplikacji bezpośrednio z platformy, na której działa. Platforma Java z każdą nową wersją zwiększa swoją funkcjonalność. Nie jest niespodzianką, że w pewnym momencie środowisko wykonawcze stanie się monolitycznym artefaktem i odbije się na pamięci i wydajności. Z tego powodu programiści od dawna prosili o wyjście z tego problemu. Ponadto większość programów nie korzysta w całości z platformy Java. Jeśli program można zoptymalizować pod kątem wydajności i użycia pamięci, dlaczego nie można również dostosować platformy, na której działa? Java 8 zrobiła pierwszy krok i próbowała zaimplementować niektóre jego aspekty za pomocą Profilów kompaktowych . Java 9 poszła naprzód i zaimplementowała sposób tworzenia niestandardowych obrazów środowiska wykonawczego bez ograniczeń, które Kompaktowe profile nałożone. Przyjęto holistyczne podejście do pakowania obrazów środowiska wykonawczego. Sama platforma jest zmodularyzowana, aby umożliwić tę funkcję. Kod aplikacji spakowany w moduły może być dostarczany z niestandardowymi obrazami środowiska wykonawczego, które zawierają tylko te moduły platformy, które są używane przez aplikację. W związku z tym aplikacja może być pojedynczym artefaktem w pakiecie, który zawiera niestandardowe środowisko JRE. To z pewnością wpływa na wydajność, zapewniając czas uruchamiania przy mniejszej ilości pamięci. Jeśli aplikacja działa w chmurze, znacznie zmniejsza to przeciążenie sieci i czas pobierania.
Profil kompaktowy
Chociaż Java 9 przekroczyła koncepcję Compact Profile wprowadzony wraz z Javą 8, często pomocne jest zrozumienie i docenienie osiągniętego kamienia milowego. W pewnym sensie Java 9 wykorzystała ten pomysł i unowocześniła koncepcję profilu kompaktowego w bardziej holistyczny sposób.
Profil kompaktowy definiuje podzbiory interfejsu API platformy Java SE, które mogą zmniejszyć statyczny rozmiar środowiska wykonawczego Java. Ten pomysł jest zasadniczo ukierunkowany na pracę na urządzeniach o ograniczonych zasobach, które mają mniejszą pojemność pamięci, takich jak urządzenie wbudowane. Istnieją zasadniczo trzy profile o nazwie compact1 , kompakt2 i compact3 . Każdy profil o wyższym numerze jest nadrzędnym zestawem jego profilu o niższym numerze. Oznacza to, że compact1 jest właściwym podzbiorem compact2 , kompakt2 jest właściwym podzbiorem compact3 i compact3 z kolei jest właściwym podzbiorem pełnego stosu Java 8 SE API.
Referencje:
- Profile kompaktowe, dokumentacja Java SE 8
- Przegląd profili Java SE Embedded 8 Compact
- Wprowadzenie do profili Java 8 Compact
Przedstawiamy JIMAGE
JIMAGE to specjalny format pliku wprowadzony wraz z Javą 9 do przechowywania niestandardowych obrazów środowiska uruchomieniowego. Ten format pliku jest zoptymalizowany pod kątem wydajności i przechowywania. Format pliku zasadniczo działa jako kontener dla zasobów, klas i modułów JDK i indeksuje je w celu szybkiego wyszukiwania i szybszego ładowania klas. W przeciwieństwie do innych formatów plików, takich jak JAR i JMOD, JIMAGE jest rzadko używany przez programistów, ponieważ odnosi się do wewnętrznych elementów JDK, z wyjątkiem sytuacji, gdy chce się zbudować niestandardowy obraz środowiska wykonawczego. Ładowanie klas jest szybsze dzięki JIMAGE niż JAR lub JMOD, ponieważ jest specjalnie do tego zoptymalizowane. Ponadto JIMAGE może być używany tylko w czasie wykonywania. JIMAGE jest wciąż w początkowych latach. Dostępnych jest bardzo mało informacji dla programistów; być może więcej zostanie ujawnionych później.
Tworzenie niestandardowych obrazów
Java 9 dostarcza jlink narzędzie do tworzenia obrazów środowiska uruchomieniowego specyficznych dla platformy. Obrazy niestandardowe zawierają moduły specyficzne dla aplikacji i wymagane moduły platformy. Ponieważ rozmiar obrazu środowiska wykonawczego zwanego JRE jest zmniejszony do absolutnego minimum, obraz aplikacji wraz ze środowiskiem JRE jest również minimalny. Łączy JRE jako pojedynczą jednostkę dostawy wraz z programem. link narzędzie znajduje się w /bin katalog JDK9 zainstalowany katalog. Dostępnych jest kilka opcji powiązanych z tym narzędziem, których można używać zgodnie z wymaganiami. Opis można uzyskać, korzystając z –pomocy opcja dostępna z jlink Komenda. Tutaj jest wyodrębniany dla wygody lub możesz wpisać jlink –help w wierszu poleceń, aby uzyskać następującą listę.
Użycie:
jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
Opcja | Opis |
–dodaj moduły | Moduły roota do rozwiązania |
–bind-services | Link w modułach usługodawcy i ich zależnościach |
-c, –compress=<0|1|2>
–disable-plugin
–endian | Włącz kompresję zasobów: Poziom 0:brak kompresji Poziom 1:Stałe udostępnianie ciągów Poziom 2:ZIP Wyłącz wspomnianą wtyczkę Kolejność bajtów wygenerowanego jimage (domyślnie:natywny) |
-h, –pomoc –ignoruj-informacje-podpisywania
–launcher
–limit-moduły –lista-wtyczek | Wydrukuj tę wiadomość pomocy Pomijaj błąd krytyczny, gdy podpisane modułowe pliki JAR są połączone w obrazie. Pliki związane z podpisem podpisanych modularnych plików JAR nie są kopiowane do obrazu środowiska wykonawczego. Dodaj polecenie uruchamiające o podanej nazwie dla modułu i głównej klasy, jeśli określono. Ogranicz wszechświat obserwowalnych modułów. Wyświetl listę dostępnych wtyczek. |
-p, –ścieżka-modułu <ścieżka> –brak plików-nagłówków –no-man-pages –wyjście <ścieżka>
–save-opts | Ścieżka modułu Wyklucz dołączanie plików nagłówkowych Wyklucz strony podręcznika Lokalizacja ścieżki wyjściowej Zapisz opcje jlink w podanym pliku |
-G, –strip-debug
–proponuj-dostawców [ | Usuń informacje debugowania Zaproponuj dostawców, którzy implementują dane typy usług ze ścieżki modułu |
-v, –pełny –wersja
@ | Włącz szczegółowe śledzenie Informacje o wersji Odczytaj opcje z pliku |
Prosty przykład
Tutaj omówimy bardzo prosty program od początku do końca, jak utworzyć obraz środowiska wykonawczego aplikacji Java. Założymy, że JDK9 jest poprawnie zainstalowany, a PATH i JAVA_HOME zmienne środowiskowe są odpowiednio ustawione. W moim przypadku jest zainstalowany i ustawiony w następujący sposób (na platformie Linux):
- JDK9 zainstalowany katalog /usr/lib/jvm/java-9-oracle
- ŚCIEŻKA jest ustawiona na /usr/lib/jvm/java-9-oracle/bin
- JAVA_HOME jest ustawiona na /usr/lib/jvm/java-9-oracle
Krok 1
Utwórz katalog o nazwie /Home/SampleProject i źródło katalog w nim (na przykład /Home/SampleProject/src ).
Krok 2
Utwórz katalog o nazwie org.app.test wewnątrz źródła katalog (na przykład /Home/SampleProject/src/org.app.test ).
Krok 3
Teraz wewnątrz org.app.test katalogu, utwórz plik o nazwie module-info.java . I wpisz następującą treść:
module org.app.test{ requires javafx.controls; exports org.app.test; }
Krok 4
Teraz utwórz katalog o nazwie org, app, test jeden w drugim (na przykład org.app.test/org/app/test ), a następnie utwórz plik o nazwie MyApplication.java wewnątrz testu katalogu i wpisz następującą zawartość:
package org.app.test; import javafx.application.Application; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.stage.Stage; public class MyApplication extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) throws Exception { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Congratulation!"); alert.setHeaderText("You did it. The application is running. Press OK to close"); alert.setContentText("You have successfully created a custom image"); alert.showAndWait().ifPresent(rs -> { if (rs == ButtonType.OK) { System.out.println("Pressed OK."); } }); } }
Krok 5
Utwórz /Home/SampleProject/mody informator. Tutaj zapiszemy skompilowany kod. Skompiluj kod źródłowy w następujący sposób. Obecny katalog roboczy to /Home/SampleProject .
javac -d mods --module-source-path src src/org.app.test/module-info.java src/org.app.test/org/app/test/MyApplication.java
Krok 6
Teraz utwórzmy plik JAR i zapiszmy go w lib katalog (np. /Home/SampleProject/lib ) w następujący sposób:
jar --create --file lib/org.app.test.jar --main-class org.app.test.MyApplication -C mods/org.app.test .
Krok 7
Aby przetestować, uruchom aplikację w następujący sposób:
java --module-path lib -m org.app.test
Krok 8
Teraz utwórzmy plik JMOD i zapiszmy go w jmodach katalog (na przykład Home/SampleProject/jmods ):
jmod create --class-path lib/org.app.test.jar jmods/org.app.test.jmod
Krok 9
Na koniec utwórzmy niestandardowy obraz za pomocą następującego polecenia:
jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods --add-modules org.app.test --launcher runapp=org.app.test --output dist
Spowoduje to utworzenie folderu o nazwie dist który zawiera wszystko, co jest wymagane do uruchomienia aplikacji. Program z nazwą programu uruchamiającego podaną jako runapp , znajduje się w dist/bin informator. Kliknij dwukrotnie, aby uruchomić.
Rysunek 1: Program działa
To wszystko.
Wniosek
Zapoznaj się z odpowiednią dokumentacją, aby uzyskać szczegółowy opis każdej z opcji poleceń użytych w tym artykule. Wypróbuj prosty program i zbuduj go od początku do końca. Zwiększyłoby to pewność niezbędną do eksperymentowania z nieco bardziej skomplikowanym programem, takim jak używanie więcej niż jednego modułu i radzenie sobie z ich zależnościami. JDK9 umożliwiło programistom przygotowanie bagażu środowiska wykonawczego do wypełnienia tylko niezbędnymi modułami. To jest niesamowite i doskonałe, coś, czego większość z nas oczekiwała od Javy od dłuższego czasu. Aplikacja Java może teraz zlekceważyć bagaż, który musiała nosić z pozornie niewielkiego powodu i zostać zoptymalizowana pod kątem dystrybucji.