Java 9 představila myšlenku modulárních runtime obrazů s Project Jigsaw a oficiálně vyřešila problém doručování Java runtime jako monolitické artefakty. Monolitické runtime obrazy byly nejen náročné na využití paměti, ale také snižovaly celkový výkon aplikace, která na nich běží. Nyní můžeme zabalit přizpůsobenou podmnožinu JRE na základě individuálních potřeb aplikací, které na něm běží, a mnohonásobně zvýšit jejich efektivitu. Tento článek se zabývá holistickým pohledem na tuto funkci vlastních runtime obrázků zavedených s Java 9.
Přehled
Dopad myšlenky vytvoření modulárního runtime image s Java 9 je obrovský. Otevírá dveře pro vlastní aplikaci přímo z platformy, na které běží. Platforma Java zvyšuje svou funkčnost s každou novou verzí. Není překvapením, že v určitém okamžiku bude běhové prostředí monolitickým artefaktem a bude mít velkou daň na paměti a výkonu. Kvůli tomu vývojáři dlouho požadovali cestu ven z tohoto problému. Většina programů také nepoužívá platformu Java jako celek. Pokud lze program optimalizovat pro výkon a využití paměti, proč nelze přizpůsobit platformu, na které běží? Java 8 udělala první krok a pokusila se implementovat některé její aspekty pomocí Kompaktních profilů . Java 9 to posunula kupředu a implementovala způsob, jak vytvořit vlastní runtime obrazy bez omezení, které by Kompaktní profily uloženo. Vyžadovalo to holistický přístup k balení runtime obrázků. Samotná platforma je modularizována, aby tuto funkci umožňovala. Aplikační kód zabalený do modulů lze dodat s vlastními runtime obrazy, které obsahují pouze ty moduly platformy, které aplikace používá. Aplikační program tedy může být jediným přibaleným artefaktem, který obsahuje vlastní JRE. To jistě zvyšuje výkon a poskytuje čas spuštění s menšími nároky na paměť. Pokud aplikace běží v cloudu, výrazně snižují přetížení sítě a dobu stahování.
Kompaktní profil
Přestože Java 9 překonala koncept Kompaktního profilu představený s Java 8, je často užitečné pochopit a ocenit dosažený milník. Java 9 se svým způsobem živila myšlenkou a upgradovala koncept Kompaktního profilu holističtějším způsobem.
Kompaktní profil definuje podmnožiny rozhraní API platformy Java SE, které mohou snížit statickou velikost běhového prostředí Java. Tato myšlenka je v podstatě zaměřena na práci na zařízeních s omezenými zdroji, která mají menší úložnou kapacitu, jako je vestavěné zařízení. V zásadě existují tři profily, nazývané kompaktní1 , kompaktní2 a compact3 . Každý profil s vyšším číslem je nadmnožinou svého profilu se sníženým číslem. To znamená, že kompaktní1 je správnou podmnožinou compact2 , kompaktní2 je správnou podmnožinou compact3 a compact3 , je zase správnou podmnožinou plného zásobníku Java 8 SE API.
Reference:
- Kompaktní profily, dokumentace Java SE 8
- Přehled kompaktních profilů Java SE Embedded 8
- Úvod do kompaktních profilů Java 8
Představujeme JIMAGE
JIMAGE je speciální formát souborů zavedený s Java 9 pro ukládání vlastních runtime obrázků. Tento formát souboru je optimalizován pro výkon a úložiště. Formát souboru v podstatě funguje jako kontejner pro prostředky, třídy a moduly JDK a indexuje je pro rychlé vyhledávání a rychlejší načítání tříd. Na rozdíl od jiných formátů souborů, jako jsou JAR a JMOD, vývojáři používají JIMAGE zřídka, protože se týká vnitřních částí JDK, kromě případů, kdy si člověk chce vytvořit vlastní runtime image. Načítání třídy je rychlejší s JIMAGE než JAR nebo JMOD, protože je pro to speciálně optimalizován. JIMAGE lze také použít pouze za běhu. JIMAGE je stále v prvních letech. K dispozici je velmi málo informací pro vývojáře; možná bude později odhaleno více.
Vytváření vlastních obrázků
Java 9 poskytuje jlink nástroj pro vytváření obrazů běhového prostředí pro konkrétní platformu. Vlastní obrázky obsahují moduly specifické pro aplikaci a požadované moduly platformy. Vzhledem k tomu, že velikost obrazu runtime neboli JRE je zmenšena na naprosté minimum, obraz aplikace spolu s JRE je také minimální. Sdružuje JRE jako jedinou jednotku dodávky spolu s programem. jlink nástroj se nachází v /bin adresář JDK9 nainstalovaný adresář. K tomuto nástroji je k dispozici několik možností, které lze použít podle požadavku. Popis lze získat pomocí –help možnost dostupná pomocí jlink příkaz. Zde je pro usnadnění extrahován, nebo můžete zadat jlink –help na příkazovém řádku, abyste získali následující seznam.
Použití:
jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
Možnost | Popis |
–add-modules | Kořenové moduly k vyřešení |
–bind-services | Odkaz v modulech poskytovatele služeb a jejich závislosti |
-c, –compress=<0|1|2>
–disable-plugin
–endian | Povolit kompresi zdrojů: Úroveň 0:Žádná komprese Úroveň 1:Konstantní sdílení řetězců Úroveň 2:ZIP Deaktivujte zmíněný plug-in Pořadí bajtů vygenerovaného image (výchozí:nativní) |
-h, –pomoc –ignore-signing-information
–launcher
–limit-modules –list-plugins | Vytiskněte tuto zprávu nápovědy Potlačit závažnou chybu, když jsou v obrazu propojeny podepsané modulární JAR. Soubory podepsaných modulárních JAR související s podpisem se nezkopírují do obrazu runtime. Přidejte spouštěcí příkaz s daným názvem pro modul a hlavní třídu, pokud je zadán. Omezte vesmír pozorovatelných modulů. Seznam dostupných zásuvných modulů. |
-p, –cesta-modulu –no-header-files –žádné uživatelské stránky
–výstup
–save-opts | Cesta k modulu Vyloučit zahrnutí záhlaví souborů Vyloučit manuálové stránky Umístění výstupní cesty Uložit možnosti jlink do daného souboru |
-G, –strip-debug
–suggest-providers [ | Odstraňte informace o ladění Navrhněte poskytovatele, kteří implementují dané typy služeb z cesty modulu |
-v, –verbose –verze
@ | Povolit podrobné trasování Informace o verzi Číst možnosti ze souboru |
Jednoduchý příklad
Zde si projdeme velmi jednoduchým programem od začátku do konce, jak vytvořit runtime image Java aplikace. Budeme předpokládat, že JDK9 je správně nainstalován a PATH a JAVA_HOME proměnná prostředí jsou vhodně nastaveny. V mém případě je nainstalován a nastaven následovně (na platformě Linux):
- JDK9 nainstalovaný adresář /usr/lib/jvm/java-9-oracle
- PATH je nastaveno na /usr/lib/jvm/java-9-oracle/bin
- JAVA_HOME je nastaven na /usr/lib/jvm/java-9-oracle
Krok 1
Vytvořte adresář s názvem /Home/SampleProject a src adresář v něm (například /Home/SampleProject/src ).
Krok 2
Vytvořte adresář s názvem org.app.test uvnitř src adresář (jako příklad /Home/SampleProject/src/org.app.test ).
Krok 3
Nyní uvnitř org.app.test adresář, vytvořte soubor s názvem module-info.java . A zadejte následující obsah:
module org.app.test{ requires javafx.controls; exports org.app.test; }
Krok 4
Nyní vytvořte adresář s názvem org, app, test jeden uvnitř druhého (například org.app.test/org/app/test ) a poté vytvořte soubor s názvem MyApplication.java uvnitř testu adresář a zadejte následující obsah:
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
Vytvořte /Home/SampleProject/mods adresář. Zde uložíme zkompilovaný kód. Zkompilujte zdrojový kód následovně. Současný pracovní adresář je /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
Nyní vytvoříme soubor JAR a uložíme jej do lib adresář (například /Home/SampleProject/lib ) takto:
jar --create --file lib/org.app.test.jar --main-class org.app.test.MyApplication -C mods/org.app.test .
Krok 7
Chcete-li otestovat, spusťte aplikaci následovně:
java --module-path lib -m org.app.test
Krok 8
Nyní vytvoříme soubor JMOD a uložíme jej do jmods adresář (například Home/SampleProject/jmods ):
jmod create --class-path lib/org.app.test.jar jmods/org.app.test.jmod
Krok 9
Nakonec vytvořte vlastní obrázek pomocí následujícího příkazu:
jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods --add-modules org.app.test --launcher runapp=org.app.test --output dist
Tím se vytvoří složka s názvem dist který obsahuje vše, co je potřeba ke spuštění aplikace. Program s názvem spouštěče runapp , je obsažen v dist/bin adresář. Poklepáním na něj spustíte.
Obrázek 1: Program běží
To je vše.
Závěr
Podrobný popis každé z možností příkazu použitých v tomto článku najdete v příslušné dokumentaci. Vyzkoušejte jednoduchý program a sestavte jej od začátku do konce. To by vytvořilo potřebnou jistotu pro experimentování s trochu komplikovanějším programem, jako je použití více než jednoho modulu a řešení jejich závislostí. JDK9 umožnil vývojářům připravit jeho runtime zavazadla tak, aby byla naplněna pouze nezbytnými moduly. To je úžasné a vynikající, něco, co většina z nás od Javy dlouho očekává. Java aplikace se nyní může zbavit zavazadel, které musela nést ze zjevně malého důvodu, a stát se platformou optimalizovanou pro distribuci.