Capítulo 4: OpenJDK 21 en Debian, Ubuntu y MX-Linux: Guía Completa.

Anuncio

OpenJDK 21 LTS es la implementación de referencia de código abierto de la versión 21 de Java SE, siguiendo las últimas especificaciones del ecosistema Java. Esta versión, que representa el lanzamiento de soporte extendido (LTS) más actual, introduce mejoras significativas en concurrencia, rendimiento, seguridad y modularidad, orientadas a facilitar el desarrollo y ejecución de aplicaciones modernas y escalables.

OpenJDK 21 no está incluido por defecto en los repositorios oficiales de Debian 12 y MX Linux 23, ya que la versión predeterminada sigue siendo OpenJDK 17. Esto significa que si un usuario desea instalar OpenJDK 21, debe hacerlo manualmente descargando los paquetes desde fuentes externas, en https://openjdk.org/.

Disponibilidad y Proveedores

OpenJDK 21 alcanzó su disponibilidad general en un lanzamiento planeado para septiembre de 2023, consolidándose como la plataforma preferida para desarrolladores y administradores de sistemas. Los binarios listos para producción, distribuidos bajo la licencia GPL con excepción de enlaces, son ofrecidos por Oracle y otros proveedores reconocidos en la comunidad. Con esta actualización, OpenJDK 21 sustituye a versiones anteriores (como la 17), con mejoras en todas las áreas críticas del desarrollo de software.

Historia de OpenJDK y su ideólogo en el código abierto

OpenJDK tiene una historia fascinante que se remonta a los esfuerzos de Sun Microsystems, la empresa que originalmente desarrolló Java. En 1995, Sun lanzó la primera versión de Java con el lema «Escribe una vez, ejecuta en todas partes», lo que revolucionó el desarrollo de software. Sin embargo, en sus primeros años, Java SE sé distribuía bajo una licencia propietaria, lo que limitaba su accesibilidad.

En 2006, Sun Microsystems tomó la decisión de hacer que Java SE fuera de código abierto, lo que llevó a la creación de OpenJDK, la implementación oficial y abierta de Java SE. Este movimiento permitió que desarrolladores de todo el mundo contribuyeran al proyecto, fomentando la innovación y la colaboración.

El creador principal de Java fue James Gosling, quien lideró el desarrollo del lenguaje en Sun Microsystems en los años 90. Inicialmente, Java se llamaba Project Oak, pero el nombre fue cambiado a Java en 1995 debido a problemas de marca registrada. Gosling diseñó Java con una sintaxis similar a C/C++, pero con un enfoque en la portabilidad y la seguridad.

En 2010, Oracle adquirió Sun Microsystems y asumió el liderazgo de OpenJDK, asegurando que siguiera siendo la implementación de referencia de Java SE. Desde entonces, OpenJDK ha evolucionado con nuevas versiones y mejoras, consolidándose como la opción preferida para el desarrollo en Java en entorno libre y de código abierto.

Características Destacadas

Las principales novedades y mejoras en OpenJDK 21 incluyen:

  1. Hilos Virtuales: Los nuevos hilos virtuales (Virtual Threads) permiten gestionar de forma ligera y escalable miles de hilos, simplificando la programación concurrente para aplicaciones de alto rendimiento y que requieren escalabilidad masiva ().
  2. Patrones de Registros y Coincidencia en Switch: Se han consolidado y extendido las mejoras en los record patterns y la coincidencia de patrones en las expresiones switch. Esto facilita la escritura de código más conciso, seguro y legible, eliminando patrones redundantes en el manejo de estructuras condicionales.
  3. API de Memoria Optimizada: Se ha mejorado el manejo de la memoria mediante nuevas API y optimizaciones a nivel de bajo nivel, lo que resulta en un rendimiento superior y una gestión de recursos más eficiente en aplicaciones complejas.
  4. Encapsulamiento y Modularidad Fortalecidos: Con actualizaciones en la estructura modular del JDK, se refuerza el encapsulamiento de componentes internos. Esto garantiza mayor seguridad y estabilidad, permitiendo a los desarrolladores trabajar únicamente con las interfaces públicas definidas.
  5. Optimización en Compiladores AOT y JIT: Se han implementado mejoras en los compiladores AOT (Ahead-Of-Time) y JIT (Just-In-Time), proporcionando arranques más rápidos y una ejecución optimizada de las aplicaciones Java.

Estas características hacen de OpenJDK 21 una plataforma moderna y robusta, adaptada tanto para el desarrollo experimental como para aplicaciones empresariales de alta demanda.

Instalación de OpenJDK 21

Para comenzar a disfrutar de las ventajas de OpenJDK 21 en sistemas basados en Debian (incluyendo Ubuntu y MX-Linux), sigue alguno de los siguientes métodos:

Debido a que MX-Linux 23 traé de serie y por defecto OpenJDK 17, Debes descargarte el OpenJDK 21 de: https://jdk.java.net/21/ yendo a la versión java 21 en https://jdk.java.net/archive/ descargando el paquete .tar.gz

wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz

Se nos descargará en el directorio /Descargas

Nos creamos el directorio /opt/java :

$ sudo mkdir -p /opt/java

Podemos extraer el archivo descargado para obtener todos los archivos y directorios que contienen OpenJDK y moverlos al directorio /opt/java :

$ sudo tar xvf openjdk-21.0.2_linux-x64_bin.tar.gz -C /opt/java

Para configurar el entorno OpenJDK 21, metemos estas tres variables de entorno en la terminal:

Anuncio
$ export JAVA_HOME=/opt/java/jdk-21.0.2
$ export PATH=$PATH:$JAVA_HOME/bin
$ export CLASSPATH=.:$JAVA_HOME/lib

Confirma la creación de la variable $JAVA_HOME y la actualización de PATH y todo ha salido correcto:

$ echo $JAVA_HOME
/opt/java/jdk-21.0.2
$ echo $PATH
/bin:/opt/Qt/6.5.3/gcc_64/bin:/opt/Qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/opt/java/jdk-21.0.2/bin

Complementos de Integración

Además, para integrar OpenJDK 21 con herramientas y entornos de desarrollo, puedes instalar los siguientes paquetes:

$ sudo apt install jtreg7 java-package uwsgi-app-integration-plugins

Alternar Entre Versiones de Java

Para asegurarte de que OpenJDK 21 se muestre, debes verificar que esté instalado y configurado correctamente:

// $ sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-21.0.2 2 
$ sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk-21.0.2/bin/java" 0
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk-21.0.2/bin/javac" 0
$ sudo update-alternatives --set java /usr/lib/jvm/jdk-21.0.2/bin/java
$ sudo update-alternatives --set javac /usr/lib/jvm/jdk-21.0.2/bin/javac

Si en tu sistema están instaladas múltiples versiones de Java, puedes seleccionar la versión por defecto usando:

$ sudo update-alternatives --config java

Existen 4 opciones para la alternativa java (que provee /usr/bin/java).

  Selección   Ruta                                         Prioridad  Estado
------------------------------------------------------------
  0            /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/java   352378880 modo automático
* 1            /opt/java/jdk-21.0.2/bin/java                 0         modo manual
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      modo manual
  3            /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/java   352378880 modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 1

Al ejecutarlo, se mostrará una lista de todas las versiones instaladas. Simplemente, ingresa el número correspondiente a OpenJDK 21 para configurarla como la versión predeterminada.

Verificación de la Instalación

Para confirmar que OpenJDK 21 se ha instalado correctamente y está listo para usarse, ejecuta:

$ java -version
openjdk version "21.0.2" 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-58)
OpenJDK 64-Bit Server VM (build 21.0.2+13-58, mixed mode, sharing)

Introducimos 2 comandos de java, el compilador (javac) y el intérprete de java (Java) para comprobar que contestan en la línea de órdenes:

// el compilador java
$ javac
Usage: javac <options> <source files>
where possible options include:
  @<filename>                  Read options and filenames from file
  -Akey[=value]                Options to pass to annotation processors
  --add-modules <module>(,<module>)*
        Root modules to resolve in addition to the initial modules,
        or all modules on the module path if <module> is ALL-MODULE-PATH.
  --boot-class-path <path>, -bootclasspath <path>
        Override location of bootstrap class files
  --class-path <path>, -classpath <path>, -cp <path>
        Specify where to find user class files and annotation processors
  -d <directory>               Specify where to place generated class files
  -deprecation
        Output source locations where deprecated APIs are used
  --enable-preview
        Enable preview language features.
        To be used in conjunction with either -source or --release.
  -encoding <encoding>         Specify character encoding used by source files
  -endorseddirs <dirs>         Override location of endorsed standards path
  -extdirs <dirs>              Override location of installed extensions
  -g                           Generate all debugging info
  -g:{lines,vars,source}       Generate only some debugging info
  -g:none                      Generate no debugging info
  -h <directory>
        Specify where to place generated native header files
  --help, -help, -?            Print this help message
  --help-extra, -X             Print help on extra options
  -implicit:{none,class}
        Specify whether to generate class files for implicitly referenced files
  -J<flag>                     Pass <flag> directly to the runtime system
  --limit-modules <module>(,<module>)*
        Limit the universe of observable modules
  --module <module>(,<module>)*, -m <module>(,<module>)*
        Compile only the specified module(s), check timestamps
  --module-path <path>, -p <path>
        Specify where to find application modules
  --module-source-path <module-source-path>
        Specify where to find input source files for multiple modules
  --module-version <version>
        Specify version of modules that are being compiled
  -nowarn                      Generate no warnings
  -parameters
        Generate metadata for reflection on method parameters
  -proc:{none,only,full}
        Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...]
        Names of the annotation processors to run;
        bypasses default discovery process
  --processor-module-path <path>
        Specify a module path where to find annotation processors
  --processor-path <path>, -processorpath <path>
        Specify where to find annotation processors
  -profile <profile>
        Check that API used is available in the specified profile.
        This option is deprecated and may be removed in a future release.
  --release <release>
        Compile for the specified Java SE release.
        Supported releases: 
            8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21
  -s <directory>               Specify where to place generated source files
  --source <release>, -source <release>
        Provide source compatibility with the specified Java SE release.
        Supported releases: 
            8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21
  --source-path <path>, -sourcepath <path>
        Specify where to find input source files
  --system <jdk>|none          Override location of system modules
  --target <release>, -target <release>
        Generate class files suitable for the specified Java SE release.
        Supported releases: 
            8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21
  --upgrade-module-path <path>
        Override location of upgradeable modules
  -verbose                     Output messages about what the compiler is doing
  --version, -version          Version information
  -Werror                      Terminate compilation if warnings occur
// El intérprete java.
$ java
Usage: java [options] <mainclass> [args...]
           (to execute a class)
   or  java [options] -jar <jarfile> [args...]
           (to execute a jar file)
   or  java [options] -m <module>[/<mainclass>] [args...]
       java [options] --module <module>[/<mainclass>] [args...]
           (to execute the main class in a module)
   or  java [options] <sourcefile> [args]
           (to execute a single source-file program)

 Arguments following the main class, source file, -jar <jarfile>,
 -m or --module <module>/<mainclass> are passed as the arguments to
 main class.

 where options include:

    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
    --class-path <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -p <module path>
    --module-path <module path>...
                  A : separated list of elements, each element is a file path
                  to a module or a directory containing modules. Each module is either
                  a modular JAR or an exploded-module directory.
    --upgrade-module-path <module path>...
                  A : separated list of elements, each element is a file path
                  to a module or a directory containing modules to replace
                  upgradeable modules in the runtime image. Each module is either
                  a modular JAR or an exploded-module directory.
    --add-modules <module name>[,<module name>...]
                  root modules to resolve in addition to the initial module.
                  <module name> can also be ALL-DEFAULT, ALL-SYSTEM,
                  ALL-MODULE-PATH.
    --enable-native-access <module name>[,<module name>...]
                  modules that are permitted to perform restricted native operations.
                  <module name> can also be ALL-UNNAMED.
    --list-modules
                  list observable modules and exit
    -d <module name>
    --describe-module <module name>
                  describe a module and exit
    --dry-run     create VM and load main class but do not execute main method.
                  The --dry-run option may be useful for validating the
                  command-line options such as the module system configuration.
    --validate-modules
                  validate all modules and exit
                  The --validate-modules option may be useful for finding
                  conflicts and other errors with modules on the module path.
    -D<name>=<value>
                  set a system property
    -verbose:[class|module|gc|jni]
                  enable verbose output for the given subsystem
    -version      print product version to the error stream and exit
    --version     print product version to the output stream and exit
    -showversion  print product version to the error stream and continue
    --show-version
                  print product version to the output stream and continue
    --show-module-resolution
                  show module resolution output during startup
    -? -h -help
                  print this help message to the error stream
    --help        print this help message to the output stream
    -X            print help on extra options to the error stream
    --help-extra  print help on extra options to the output stream
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:jdwp
                  see also -agentlib:jdwp=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
                  HiDPI scaled images are automatically supported and used
                  if available. The unscaled image filename, e.g. image.ext,
                  should always be passed as the argument to the -splash option.
                  The most appropriate scaled image provided will be picked up
                  automatically.
                  See the SplashScreen API documentation for more information
    @argument files
                  one or more argument files containing options
    --disable-@files
                  prevent further argument file expansion
    --enable-preview
                  allow classes to depend on preview features of this release
To specify an argument for a long option, you can use --<name>=<value> or
--<name> <value>.

HolaMundo.java

A continuación, se muestra un sencillo ejemplo en Java 21:

public class HolaMundo {
    public static void main(String[] args) {
        System.out.println("Hola ojosdegato");
    }
}

Para compilar y ejecutar el programa, sigue estos pasos:

Guarda el archivo HolaMundo.java.

  1. Compilar el código: $ javac HolaMundo.java
  2. Ejecutar el programa: $ java HolaMundo

La salida será:

Hola ojosdegato

Conclusiones

Con OpenJDK 21 instalado en tu sistema Debian, Ubuntu o MX-Linux, cuentas con un entorno robusto y actualizado para desarrollar y ejecutar aplicaciones Java. Esta guía completa te ha conducido desde la instalación inicial hasta la verificación del entorno, pasando por ejemplos prácticos que ilustran el proceso de desarrollo en Java 21. Gracias a las innovaciones en concurrencia, manejo de memoria y modularidad, OpenJDK 21 te brinda las herramientas necesarias para crear aplicaciones modernas, seguras y escalables.

Explora la documentación oficial de OpenJDK y las comunidades de Debian y Ubuntu para descubrir aún más novedades y optimizaciones que puedan potenciar tus proyectos en Java. Además, mantente atento a las futuras actualizaciones y mejoras que continuamente enriquecen el ecosistema de Java.

Referencias

EDteam – En español nadie te explica mejor: He realizado unos cursos gratis y excelentes, te exigen un 9 para obtener un certificado de aprovechamiento, exigen mucho y aprendes un montón.

OpenJDK es la versión libre de la plataforma de desarrollo Java en: https://openjdk.org/

Nuestra puntuación
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)
Anuncio
Comparte en las redes sociales...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
ResponsableJavier Cachón Garrido +información...
FinalidadGestionar y moderar tus comentarios. +información...
LegitimaciónConsentimiento del interesado. +información...
DestinatariosAutomattic Inc., EEUU para filtrar el spam. +información...
DerechosAcceder, rectificar y cancelar los datos, así como otros derechos. +información...
Información adicionalPuedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Scroll al inicio

Descubre más desde javiercachon.com

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo