Guía de jlink

1. Información general

jlink es una herramienta que genera una imagen de tiempo de ejecución de Java personalizada que contiene solo los módulos de plataforma que se requieren para una aplicación determinada.

Dicha imagen en tiempo de ejecución actúa exactamente como el JRE, pero contiene solo los módulos que seleccionamos y las dependencias que necesitan para funcionar. El concepto de imágenes modulares en tiempo de ejecución se introdujo en JEP 220.

En este tutorial, aprenderemos cómo crear un JRE personalizado usando jlink , y también ejecutaremos y probaremos que nuestro módulo funcione correctamente dentro de nuestro JRE.

2. Necesidad de crear un JRE personalizado

Entendamos la motivación detrás de las imágenes en tiempo de ejecución personalizadas con un ejemplo.

Crearemos una aplicación modular simple. Para saber más sobre la creación de aplicaciones modulares, consulte nuestro artículo sobre modularidad.

Primero, creemos una clase HelloWorld y un módulo correspondiente:

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

Para ejecutar este programa, solo necesitamos las clases HelloWorld, String , Logger y Object .

Aunque este programa solo necesita cuatro clases para ejecutarse, todas las clases predefinidas en el JRE también se ejecutan, incluso si nuestro programa no las requiere.

Por tanto, para ejecutar un programa pequeño, tenemos que mantener un JRE completo, que es simplemente una pérdida de memoria.

Entonces, un JRE personalizado es la mejor opción para ejecutar nuestro ejemplo.

Con jlink , podemos crear nuestro propio JRE pequeño que contiene solo las clases relevantes que queremos usar, sin desperdiciar memoria y, como resultado, veremos un mayor rendimiento.

3. Creación de imágenes personalizadas en tiempo de ejecución de Java

Realizaremos una serie de sencillos pasos para crear imágenes JRE personalizadas.

3.1. Compilar un módulo

Primero, compilemos el programa mencionado anteriormente desde la línea de comando:

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

Ahora, ejecutemos el programa:

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

La salida será:

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

3.2. Uso de jdeps para enumerar los módulos dependientes

Para usar jlink , necesitamos conocer la lista de los módulos JDK que usa la aplicación y que debemos incluir en nuestro JRE personalizado.

Utilización de dejar que el jdeps órdenes para obtener los módulos dependientes utilizados en la aplicación:

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

La salida será:

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

Esto tiene sentido, ya que java.base es el módulo mínimo necesario para las bibliotecas de código Java, y java.logging es utilizado por un registrador en nuestro programa.

3.3. Creando un JRE personalizado con jlink

Para crear un JRE personalizado para una aplicación basada en módulos, podemos usar el comando jlink . Aquí está su sintaxis básica:

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

Ahora, creemos un JRE personalizado para nuestro programa usando Java 11:

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

Aquí, el valor después del parámetro –add-modules le dice a jlink qué módulo incluir en el JRE.

Finalmente, el customjre junto al parámetro –output define el directorio de destino donde se debe generar nuestro JRE personalizado.

Tenga en cuenta que usamos el shell de Windows para ejecutar todos los comandos a lo largo de este tutorial. Es posible que los usuarios de Linux y Mac deban ajustarlos ligeramente.

3.4. Ejecución de una aplicación con la imagen generada

Ahora, tenemos nuestro JRE personalizado creado por jlink .

Para probar nuestro JRE, intentemos ejecutar nuestro módulo navegando dentro de la carpeta bin de nuestro directorio customjre y ejecutemos el siguiente comando:

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

Nuevamente, el shell de Windows, que usamos, busca en el directorio actual cualquier ejecutable antes de proceder a la RUTA. Necesitamos prestar especial atención para ejecutar nuestro JRE personalizado, y no el java resuelto contra un PATH cuando estamos en Linux o Mac.

4. Creación de JRE personalizado con scripts de inicio

Opcionalmente, también podemos crear un JRE personalizado con scripts de lanzamiento ejecutables .

For this, we need to run the jlink command that has an extra –launcher parameter to create our launcher with our module and main class:

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

This will generate two scripts: customjrelauncher.bat and customjrelauncher inside our customjre/bin directory.

Let's run the script:

customjrelauncher.bat

And the output will be:

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

5. Conclusion

In this tutorial, we have learned how we can create a custom, modular JRE with jlink that only contains the bare minimum files needed for our module. We also looked into how to create a custom JRE with launcher scripts that can be easily executed and shipped.

Las imágenes en tiempo de ejecución de Java modulares y personalizadas son poderosas. Los objetivos para crear JRE personalizados son claros: ahorran memoria, mejoran el rendimiento y también mejoran la seguridad y el mantenimiento. Los JRE personalizados ligeros también nos permiten crear aplicaciones escalables para dispositivos pequeños.

Los fragmentos de código utilizados en este tutorial están disponibles en Github.