Guide de jlink

1. Vue d'ensemble

jlink est un outil qui génère une image d'exécution Java personnalisée qui contient uniquement les modules de plate-forme requis pour une application donnée.

Une telle image d'exécution agit exactement comme le JRE mais ne contient que les modules que nous avons choisis et les dépendances dont ils ont besoin pour fonctionner. Le concept d'images d'exécution modulaires a été introduit dans JEP 220.

Dans ce didacticiel, nous allons apprendre à créer un JRE personnalisé à l'aide de jlink , et nous allons également exécuter et tester que notre module fonctionne correctement dans notre JRE.

2. Besoin de créer un JRE personnalisé

Comprenons la motivation derrière les images d'exécution personnalisées avec un exemple.

Nous allons créer une application modulaire simple. Pour en savoir plus sur la création d'applications modulaires, veuillez consulter notre article sur la modularité.

Tout d'abord, créons une classe HelloWorld et un module correspondant:

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; }

Pour exécuter ce programme, nous n'avons besoin que des classes HelloWorld, String , Logger et Object .

Même si ce programme n'a besoin que de quatre classes pour s'exécuter, toutes les classes prédéfinies dans le JRE sont également exécutées, même si notre programme n'en a pas besoin.

Par conséquent, pour exécuter un petit programme, nous devons maintenir un JRE complet, ce qui est simplement une perte de mémoire.

Ainsi, un JRE personnalisé est la meilleure option pour exécuter notre exemple.

Avec jlink , nous pouvons créer notre propre petit JRE qui ne contient que les classes pertinentes que nous voulons utiliser, sans gaspiller de mémoire, et par conséquent, nous verrons des performances accrues.

3. Création d'images Java Runtime personnalisées

Nous allons effectuer une série d'étapes simples pour créer des images JRE personnalisées.

3.1. Compiler un module

Tout d'abord, compilons le programme mentionné ci-dessus à partir de la ligne de commande:

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

Maintenant, exécutons le programme:

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

La sortie sera:

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

3.2. Utilisation de jdeps pour répertorier les modules dépendants

Pour utiliser jlink , nous devons connaître la liste des modules JDK que l'application utilise et que nous devons inclure dans notre JRE personnalisé.

Utilisons la commande jdeps pour obtenir les modules dépendants utilisés dans l'application:

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

La sortie sera:

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

Cela a du sens, car java.base est le module minimum requis pour les bibliothèques de code Java, et java.logging est utilisé par un enregistreur dans notre programme.

3.3. Création d'un JRE personnalisé avec jlink

Pour créer un JRE personnalisé pour une application basée sur un module, nous pouvons utiliser la commande jlink . Voici sa syntaxe de base:

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

Maintenant, créons un JRE personnalisé pour notre programme à l' aide de Java 11:

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

Ici, la valeur après le paramètre –add-modules indique à jlink quel module inclure dans le JRE.

Enfin, le customjre à côté du paramètre –output définit le répertoire cible dans lequel notre JRE personnalisé doit être généré.

Notez que nous utilisons le shell Windows pour exécuter toutes les commandes tout au long de ce didacticiel. Les utilisateurs Linux et Mac devront peut-être les ajuster légèrement.

3.4. Exécution d'une application avec l'image générée

Maintenant, nous avons notre JRE personnalisé créé par jlink .

Pour tester notre JRE, essayons d'exécuter notre module en naviguant dans le dossier bin de notre répertoire customjre et exécutez la commande ci-dessous:

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

Encore une fois, le shell Windows, que nous utilisons, recherche dans le répertoire courant tout exécutable avant de passer au PATH. Nous devons prêter une attention particulière pour exécuter réellement notre JRE personnalisé, et non le java résolu par un PATH lorsque nous sommes sous Linux ou Mac.

4. Création de JRE personnalisé avec des scripts de lancement

En option, nous pouvons également créer un JRE personnalisé avec des scripts de lancement exécutables .

Pour cela, nous devons exécuter la commande jlink qui a un paramètre supplémentaire –launcher pour créer notre lanceur avec notre module et notre classe principale :

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

Cela générera deux scripts: customjrelauncher.bat et customjrelauncher dans notre répertoire customjre / bin .

Lançons le script:

customjrelauncher.bat

Et la sortie sera:

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

5. Conclusion

Dans ce didacticiel, nous avons appris comment créer un JRE modulaire personnalisé avec jlink qui ne contient que le minimum de fichiers requis pour notre module. Nous avons également examiné comment créer un JRE personnalisé avec des scripts de lancement qui peuvent être facilement exécutés et expédiés.

Les images d'exécution Java personnalisées et modulaires sont puissantes. Les objectifs de la création de JRE personnalisés sont clairs: ils économisent de la mémoire, améliorent les performances et améliorent également la sécurité et la maintenabilité. Les JRE personnalisés légers nous permettent également de créer des applications évolutives pour les petits appareils.

Les extraits de code utilisés dans ce didacticiel sont disponibles sur Github.