Guida a jlink

1. Panoramica

jlink è uno strumento che genera un'immagine runtime Java personalizzata che contiene solo i moduli della piattaforma richiesti per una determinata applicazione.

Tale immagine runtime si comporta esattamente come JRE ma contiene solo i moduli che abbiamo scelto e le dipendenze di cui hanno bisogno per funzionare. Il concetto di immagini runtime modulari è stato introdotto in JEP 220.

In questo tutorial impareremo come creare un JRE personalizzato usando jlink , e eseguiremo e testeremo anche che il nostro modulo funzioni correttamente all'interno del nostro JRE.

2. È necessario creare un JRE personalizzato

Comprendiamo la motivazione dietro le immagini runtime personalizzate con un esempio.

Creeremo una semplice applicazione modulare. Per saperne di più sulla creazione di applicazioni modulari, fare riferimento al nostro articolo sulla modularità.

Per prima cosa, creiamo una classe HelloWorld e un modulo corrispondente:

public class HelloWorld { private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName()); public static void main(String[] args) { LOG.info("Hello World!"); } }
module jlinkModule { requires java.logging; }

Per eseguire questo programma, abbiamo solo bisogno delle classi HelloWorld, String , Logger e Object .

Anche se questo programma richiede solo quattro classi per essere eseguito, vengono eseguite anche tutte le classi predefinite nel JRE, anche se il nostro programma non le richiede.

Pertanto, per eseguire un piccolo programma, dobbiamo mantenere un JRE completo, che è semplicemente uno spreco di memoria.

Quindi, un JRE personalizzato è l'opzione migliore per eseguire il nostro esempio.

Con jlink , possiamo creare il nostro piccolo JRE che contiene solo le classi rilevanti che vogliamo utilizzare, senza sprecare memoria e, di conseguenza, vedremo un aumento delle prestazioni.

3. Creazione di immagini Java Runtime personalizzate

Eseguiremo una serie di semplici passaggi per creare immagini JRE personalizzate.

3.1. Compilazione di un modulo

Per prima cosa, compiliamo il programma menzionato sopra dalla riga di comando:

javac -d out module-info.java
javac -d out --module-path out com\baeldung\jlink\HelloWorld.java

Ora eseguiamo il programma:

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

L'output sarà:

Mar 13, 2019 10:15:40 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!

3.2. Utilizzo di jdeps per elencare i moduli dipendenti

Per poter utilizzare jlink , dobbiamo conoscere l'elenco dei moduli JDK utilizzati dall'applicazione e che dovremmo includere nel nostro JRE personalizzato.

Usiamo il comando jdeps per ottenere i moduli dipendenti utilizzati nell'applicazione:

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

L'output sarà:

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

Questo ha senso, poiché java.base è il modulo minimo necessario per le librerie di codice Java e java.logging è utilizzato da un logger nel nostro programma.

3.3. Creazione di un JRE personalizzato con jlink

Per creare un JRE personalizzato per un'applicazione basata su moduli, possiamo utilizzare il comando jlink . Ecco la sua sintassi di base:

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

Ora creiamo un JRE personalizzato per il nostro programma utilizzando Java 11:

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

Qui, il valore dopo il parametro –add -modules indica a jlink quale modulo includere nel JRE.

Infine, il customjre accanto al parametro –output definisce la directory di destinazione in cui deve essere generato il nostro JRE personalizzato.

Nota, usiamo la shell di Windows per eseguire tutti i comandi in questo tutorial. Gli utenti Linux e Mac potrebbero doverli aggiustare leggermente.

3.4. Esecuzione di un'applicazione con l'immagine generata

Ora, abbiamo il nostro JRE personalizzato creato da jlink .

Per testare il nostro JRE, proviamo a eseguire il nostro modulo navigando all'interno della cartella bin della nostra directory customjre ed eseguiamo il comando seguente:

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

Di nuovo, la shell di Windows, che usiamo, cerca nella directory corrente qualsiasi eseguibile prima di procedere al PERCORSO. Dobbiamo prestare particolare attenzione per eseguire effettivamente il nostro JRE personalizzato, e non il java risolto contro un PATH quando siamo su Linux o Mac.

4. Creazione di JRE personalizzato con script di avvio

Facoltativamente, possiamo anche creare un JRE personalizzato con script di avvio eseguibili .

Per questo, dobbiamo eseguire il comando jlink che ha un parametro extra –launcher per creare il nostro launcher con il nostro modulo e la classe principale :

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

Questo genererà due script: customjrelauncher.bat e customjrelauncher all'interno della nostra directory customjre / bin .

Eseguiamo lo script:

customjrelauncher.bat

E l'output sarà:

Mar 18, 2019 12:34:21 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!

5. conclusione

In questo tutorial, abbiamo imparato come creare un JRE modulare personalizzato con jlink che contiene solo i file minimi necessari per il nostro modulo. Abbiamo anche esaminato come creare un JRE personalizzato con script di avvio che possono essere facilmente eseguiti e distribuiti.

Le immagini runtime Java personalizzate e modulari sono potenti. Gli obiettivi per la creazione di JRE personalizzati sono chiari: risparmiano sulla memoria, migliorano le prestazioni e migliorano anche la sicurezza e la manutenibilità. I JRE personalizzati leggeri ci consentono inoltre di creare applicazioni scalabili per piccoli dispositivi.

Gli snippet di codice utilizzati in questo tutorial sono disponibili su Github.