Gids voor jlink

1. Overzicht

jlink is een tool die een aangepaste Java-runtime-image genereert die alleen de platformmodules bevat die nodig zijn voor een bepaalde toepassing.

Zo'n runtime-image werkt precies zoals de JRE, maar bevat alleen de modules die we hebben gekozen en de afhankelijkheden die ze nodig hebben om te functioneren. Het concept van modulaire runtime-images werd geïntroduceerd in JEP 220.

In deze zelfstudie leren we hoe u een aangepaste JRE kunt maken met jlink, en we zullen ook uitvoeren en testen of onze module correct functioneert binnen onze JRE.

2. U moet een aangepaste JRE maken

Laten we met een voorbeeld de motivatie achter aangepaste runtime-images begrijpen.

We maken een eenvoudige modulaire applicatie. Raadpleeg ons artikel over modulariteit voor meer informatie over het maken van modulaire toepassingen.

Laten we eerst een Hallo Wereld klasse en een bijbehorende module:

openbare klasse HelloWorld {privé statische laatste Logger LOG = Logger.getLogger (HelloWorld.class.getName ()); public static void main (String [] args) {LOG.info ("Hallo wereld!"); }}
module jlinkModule {vereist java.logging; }

Om dit programma uit te voeren, hebben we alleen nodig Hallo Wereld,Draad, Logger, en Voorwerp klassen.

Hoewel dit programma maar vier klassen nodig heeft om te draaien, worden alle vooraf gedefinieerde klassen in de JRE ook uitgevoerd, zelfs als ons programma ze niet nodig heeft.

Om een ​​klein programma uit te voeren, moeten we daarom een ​​volledige JRE onderhouden, wat gewoon een verspilling van geheugen is.

Een aangepaste JRE is dus de beste optie om ons voorbeeld te geven.

Met jlinkkunnen we onze eigen, kleine JRE maken die alleen de relevante klassen bevat die we willen gebruiken, zonder geheugen te verspillen, en als resultaat zullen we betere prestaties zien.

3. Aangepaste Java Runtime-images maken

We voeren een reeks eenvoudige stappen uit om aangepaste JRE-afbeeldingen te maken.

3.1. Een module samenstellen

Laten we eerst het hierboven genoemde programma compileren vanaf de opdrachtregel:

javac -d uit module-info.java
javac -d uit --module-pad uit com \ baeldung \ jlink \ HelloWorld.java

Laten we nu het programma uitvoeren:

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

De output zal zijn:

13 maart 2019 10:15:40 com.baeldung.jlink.HelloWorld hoofdINFO: Hallo wereld!

3.2. Gebruik makend van jdeps om de afhankelijke modules weer te geven

Om te kunnen gebruiken jlink, moeten we de lijst kennen van de JDK-modules die de toepassing gebruikt en die we in onze aangepaste JRE moeten opnemen.

Laten we de jdeps opdracht om de afhankelijke modules op te halen die in de applicatie worden gebruikt:

jdeps --module-path out -s --module jlinkModule

De output zal zijn:

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

Dit is logisch, zoals java.base is de minimale module die nodig is voor Java-codebibliotheken, en java.logging wordt gebruikt door een logger in ons programma.

3.3. Een aangepaste JRE maken met jlink

Om een ​​aangepaste JRE te maken voor een module-gebaseerde applicatie, kunnen we de jlink opdracht. Dit is de basissyntaxis:

jlink [opties] –module-pad modulepad –add-modules module [, module…] --output 

Laten we nu maak een aangepaste JRE voor ons programma met behulp van Java 11:

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

Hier is de waarde na de –Add-modules parameter vertelt jlink welke module in de JRE moet worden opgenomen.

eindelijk, de customjre naast het -Output parameter definieert de doelmap waar onze aangepaste JRE moet worden gegenereerd.

Let op, we gebruiken de Windows-shell om alle opdrachten in deze tutorial uit te voeren. Linux- en Mac-gebruikers moeten deze mogelijk enigszins aanpassen.

3.4. Een toepassing uitvoeren met de gegenereerde afbeelding

Nu hebben we onze aangepaste JRE gemaakt door jlink.

Laten we, om onze JRE te testen, proberen onze module uit te voeren door binnen het bak map van onze customjre directory en voer de onderstaande opdracht uit:

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

Nogmaals, de Windows-shell, die we gebruiken, zoekt in de huidige directory naar een uitvoerbaar bestand voordat we verder gaan naar het PATH. We moeten extra aandacht besteden om onze aangepaste JRE daadwerkelijk uit te voeren, en niet de Java opgelost tegen een PATH wanneer we Linux of Mac gebruiken.

4. Aangepaste JRE maken met opstartscripts

Optioneel, we kunnen ook een aangepaste JRE maken met een uitvoerbaar bestand draagraket scripts.

Hiervoor moeten we het jlink commando met een extra -Launcher parameter om onze launcher te maken met onze module en hoofdklasse:

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

Dit genereert twee scripts: customjrelauncher.bat en customjrelauncher binnen onze customjre / bin directory.

Laten we het script uitvoeren:

customjrelauncher.bat

En de output zal zijn:

18 maart 2019 12:34:21 com.baeldung.jlink.HelloWorld hoofdINFO: Hallo wereld!

5. Conclusie

In deze tutorial hebben we geleerd hoe we een aangepaste, modulaire JRE kunnen maken met jlink die alleen de minimale bestanden bevat die nodig zijn voor onze module. We hebben ook gekeken hoe we een aangepaste JRE kunnen maken met opstartscripts die eenvoudig kunnen worden uitgevoerd en verzonden.

Aangepaste, modulaire Java-runtime-images zijn krachtig. De doelen voor het maken van aangepaste JRE's zijn duidelijk: ze besparen op geheugen, verbeteren de prestaties en verbeteren ook de beveiliging en onderhoudbaarheid. Lichtgewicht aangepaste JRE's stellen ons ook in staat om schaalbare applicaties voor kleine apparaten te maken.

De codefragmenten die in deze tutorial worden gebruikt, zijn beschikbaar via Github.