Guide til jlink

1. Oversikt

jlink er et verktøy som genererer et tilpasset Java runtime-bilde som bare inneholder plattformmodulene som kreves for et gitt program.

Et slikt kjøretidsbilde fungerer akkurat som JRE, men inneholder bare modulene vi valgte og avhengighetene de trenger for å fungere. Konseptet med modulære kjøretidsbilder ble introdusert i JEP 220.

I denne opplæringen lærer vi hvordan du lager en tilpasset JRE ved hjelp av jlink, og vi vil også kjøre og teste at modulen vår fungerer riktig inne i JRE.

2. Trenger du å lage en tilpasset JRE

La oss forstå motivasjonen bak tilpassede kjøretidsbilder med et eksempel.

Vi lager en enkel modulær applikasjon. For å vite mer om hvordan du lager modulære applikasjoner, se artikkelen vår om modulærhet.

La oss først lage en Hei Verden klasse og en tilsvarende modul:

offentlig klasse HelloWorld {privat statisk slutt Logger LOG = Logger.getLogger (HelloWorld.class.getName ()); public static void main (String [] args) {LOG.info ("Hello World!"); }}
modul jlinkModule {krever java.logging; }

For å kjøre dette programmet trenger vi bare Hei Verden,String, Logger, og Gjenstand klasser.

Selv om dette programmet bare trenger fire klasser for å kjøre, blir alle de forhåndsdefinerte klassene i JRE også utført, selv om programmet vårt ikke krever dem.

Derfor, for å kjøre et lite program, må vi opprettholde en komplett JRE, som rett og slett er bortkastet minne.

Så, en tilpasset JRE er det beste alternativet for å kjøre eksemplet vårt.

Med jlink, kan vi lage vår egen, lille JRE som bare inneholder de relevante klassene vi vil bruke, uten å kaste bort minne, og som et resultat vil vi se økt ytelse.

3. Bygg tilpassede Java Runtime-bilder

Vi utfører en serie enkle trinn for å lage tilpassede JRE-bilder.

3.1. Kompilering av en modul

La oss først kompilere programmet som er nevnt ovenfor fra kommandolinjen:

javac -d ut modul-info.java
javac -d ut - modul-sti ut com \ baeldung \ jlink \ HelloWorld.java

La oss nå kjøre programmet:

java --module-path out --module jlinkModule / com.baeldung.jlink.HelloWorld

Resultatet blir:

13. mars 2019 10:15:40 com.baeldung.jlink.HelloWorld hovedINFO: Hello World!

3.2. Ved hjelp av jdeps for å liste opp de avhengige modulene

For å bruke jlink, må vi vite listen over JDK-modulene som applikasjonen bruker, og som vi bør inkludere i vår tilpassede JRE.

La oss bruke jdeps kommando for å få de avhengige modulene som brukes i applikasjonen:

jdeps - modul-sti ut -s - modul jlinkModule

Resultatet blir:

jlinkModule -> java.base jlinkModule -> java.logging

Dette er fornuftig, som java.base er minimumsmodulen som trengs for Java-kodebiblioteker, og java.logging brukes av en logger i vårt program.

3.3. Opprette en tilpasset JRE med jlink

For å lage en tilpasset JRE for et modulbasert program, kan vi bruke jlink kommando. Her er den grunnleggende syntaksen:

jlink [options] –module-path modulepath –add-modules module [, module…] - utgang 

La oss nå lage en tilpasset JRE for programmet vårt ved hjelp av Java 11:

jlink --module-path "% JAVA_HOME% \ jmods"; out --add-modules jlinkModule --output customjre

Her er verdien etter – Legge til moduler parameter forteller jlink hvilken modul som skal inkluderes i JRE.

Til slutt, customjre ved siden av -produksjon parameter definerer målkatalogen der vår tilpassede JRE skal genereres.

Merk, vi bruker Windows-skall til å utføre alle kommandoene gjennom denne opplæringen. Linux- og Mac-brukere må kanskje justere dem litt.

3.4. Kjører et program med det genererte bildet

Nå har vi vår tilpassede JRE opprettet av jlink.

For å teste vår JRE, la oss prøve å kjøre modulen vår ved å navigere inne i søppel mappen til vår customjre katalog og kjør kommandoen nedenfor:

java --module jlinkModule / com.baeldung.jlink.HelloWorld

Igjen ser Windows-skallet, som vi bruker, i den gjeldende katalogen for alle kjørbare filer før du fortsetter til PATH. Vi må være ekstra oppmerksomme på å faktisk kjøre vår tilpassede JRE, og ikke java løst mot en PATH når vi bruker Linux eller Mac.

4. Opprette tilpasset JRE med Launcher-skript

Valgfritt Vi kan også lage en tilpasset JRE med kjørbar bærerakett skript.

For dette må vi kjøre jlink kommando som har en ekstra –Luncher parameter for å lage lanseringen vår med vår modul og hovedklasse:

jlink --launcher customjrelauncher = jlinkModule / com.baeldung.jlink.HelloWorld --module-path "% JAVA_HOME% \ jmods"; out --add-modules jlinkModule --output customjre

Dette genererer to skript: customjrelauncher.bat og customjrelauncher inne i vår customjre / bin katalog.

La oss kjøre skriptet:

customjrelauncher.bat

Og produksjonen vil være:

18. mars 2019 12:34:21 com.baeldung.jlink.HelloWorld hovedINFO: Hello World!

5. Konklusjon

I denne opplæringen har vi lært hvordan vi kan lage en tilpasset, modulær JRE med jlink som bare inneholder minimumsfilene som trengs for modulen vår. Vi så også på hvordan du oppretter en tilpasset JRE med lanseringsskript som enkelt kan utføres og sendes.

Egendefinerte, modulære Java-kjøretidsbilder er kraftige. Målene for å lage tilpassede JRE-er er klare: de sparer minne, forbedrer ytelsen og forbedrer også sikkerhet og vedlikeholdsevne. Lette tilpassede JRE-er gjør det også mulig for oss å lage skalerbare applikasjoner for små enheter.

Kodebitene som brukes i denne opplæringen, er tilgjengelige over Github.