Capítulo 2: Como instalar y configurar el JDK Java SE 21 LTS para Debian, Ubuntu y MX-Linux.

Anuncio

Oracle anuncia el lanzamiento de Java SE 21 con Soporte extendido LTS.

La última versión de soporte a largo plazo de Java ofrece miles de actualizaciones, mejorando aún más el lenguaje y la plataforma para ayudar a los desarrolladores a ser más productivos.

Java SE 21 (LTS): Una Nueva Era en el Desarrollo en Java

Introducción

Java SE 21 (LTS) se consolida como una de las versiones más relevantes y esperadas de la plataforma Java. Con soporte a largo plazo, esta versión ofrece estabilidad y mejoras fundamentales para el desarrollo de aplicaciones empresariales y proyectos innovadores. Este documento profundiza en qué es Java SE 21, su evolución, el JDK, las novedades introducidas, sus características principales y, finalmente, se extraen conclusiones que subrayan su impacto en el ecosistema de Java.

¿Qué es Java SE 21 (LTS)?

Java SE 21 es la última versión de la edición estándar de Java, diseñada para brindar una base sólida y un entorno de desarrollo robusto. La designación LTS (Long-Term Support) indica que Oracle proporciona soporte y actualizaciones de seguridad durante un período extendido, lo cual es esencial para aplicaciones críticas y proyectos de larga duración. Esta versión refleja no solo la evolución natural de la plataforma, sino también una respuesta a las demandas actuales de rendimiento, escalabilidad y facilidad de mantenimiento en aplicaciones modernas.

El JDK (Java Development Kit)

El JDK es el conjunto indispensable de herramientas y bibliotecas para desarrollar, compilar, depurar y ejecutar aplicaciones Java. En Java SE 21, el JDK ha sido actualizado y optimizado para:

  • Mejorar el rendimiento: Integrando mejoras a nivel de la JVM y nuevas funcionalidades para analizar y optimizar el uso de la memoria.

  • Simplificar el desarrollo: Con herramientas refinadas que facilitan la depuración, el testing y la integración continua.

  • Ofrecer nuevas APIs: Que potencian el desarrollo de aplicaciones más seguras y robustas.

Estas mejoras hacen del JDK de Java SE 21 una plataforma ideal para desarrolladores que buscan combinar innovación con fiabilidad en sus proyectos.

Novedades en Java SE 21

Entre las grandes novedades de Java SE 21 destacan:

  • Hilos Virtuales (Virtual Threads): Esta es, sin duda, la característica más revolucionaria. Los hilos virtuales, que hasta ahora estuvieron en estado preview, ya son definitivos en esta versión. Permiten gestionar millones de tareas concurrentes de forma eficiente, reduciendo la sobrecarga asociada a los hilos nativos y facilitando la escalabilidad de aplicaciones web y sistemas distribuidos.

  • Colecciones Secuenciadas: Se han introducido nuevas interfaces como SequencedCollection, SequencedSet y SequencedMap. Estas facilitan el manejo de colecciones con un orden explícito, permitiendo acceder con mayor sencillez al primer o último elemento y simplificando la manipulación de estructuras de datos complejas.

  • Mejoras en el Lenguaje: Se han pulido diversas características del lenguaje, impulsando el uso de records con mayor coherencia, implementando mejoras en pattern matching (por ejemplo, en sentencias switch) y optimizando la sintaxis para lograr un código más conciso y fácil de leer.

  • Nuevas API y Optimizaciones: Java SE 21 consolida funcionalidades que antes estaban en estado preview y lanza nuevas APIs orientadas a mejorar tanto el rendimiento como la seguridad en la manipulación de datos, lo que se traduce en una experiencia de desarrollo más fluida y robusta.

Características Principales

Las principales características de Java SE 21 (LTS) incluyen:

  • Soporte a Largo Plazo (LTS): Un compromiso de estabilidad y actualizaciones continuas, ideal para proyectos de misión crítica.

  • Hilos Virtuales: Mejora la concurrencia permitiendo la ejecución de un gran número de hilos sin la pesada sobrecarga de los hilos nativos.

  • Colecciones Secuenciadas: Introducen APIs intuitivas para el manejo de estructuras de datos con orden, optimizando el acceso y manipulación de elementos.

  • Mejoras en la Sintaxis y el Lenguaje: Con records, pattern matching y otras optimizaciones, se facilita la implementación de código más legible y mantenible.

  • Nuevas API de Rendimiento y Seguridad: Incorporación de herramientas y métodos que aseguran un rendimiento óptimo y una mayor robustez en la gestión de datos y procesos.

Estas características no solo potencian la productividad del desarrollador, sino que también permiten diseñar aplicaciones escalables y seguras que se adaptan a las necesidades de mercados modernos y exigentes

Descarga e instala Oracle JDK Java 21 LTS en tu sistema operativo Linux (Debian, Ubuntu, MX-Linux).

Descarga Oracle JDK Java 21 LTS en https://www.oracle.com/cl/java/technologies/downloads/

Descargas de Java SE Development Kit 21.0.7

Los binarios de JDK 21 se pueden usar de forma gratuita en producción y se pueden redistribuir sin costo alguno, según los Términos y condiciones sin cargo de Oracle (NFTC).

Anuncio

El JDK 21 recibirá actualizaciones bajo la NFTC hasta septiembre de 2026, un año después del lanzamiento de la próxima LTS. Las actualizaciones posteriores del JDK 21 se licenciarán bajo la Licencia OTN de Java SE (OTN), y el uso en producción más allá de las concesiones gratuitas limitadas de la licencia OTN requerirá el pago de una tarifa.

A continuación, descargue el paquete binario deb de x64 para una fácil instalación de Oracle Java JDK 21 (LTS):

// Oracle Java JDK 17 
$ wget -q https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb 
// Instalar Oracle Java JDK 21 
$ sudo dpkg -i jdk-21_linux-x64_bin.deb
Seleccionando el paquete jdk-21 previamente no seleccionado.
(Leyendo la base de datos ... 437118 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar jdk-21_linux-x64_bin.deb ...
Desempaquetando jdk-21 (21.0.7-ga) ...
Configurando jdk-21 (21.0.7-ga) ...
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jar para proveer /usr/bin/jar (jar) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jarsigner para proveer /usr/bin/jarsigner (jarsigner) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/java para proveer /usr/bin/java (java) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/javac para proveer /usr/bin/javac (javac) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/javadoc para proveer /usr/bin/javadoc (javadoc) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/javap para proveer /usr/bin/javap (javap) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jcmd para proveer /usr/bin/jcmd (jcmd) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jconsole para proveer /usr/bin/jconsole (jconsole) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jdb para proveer /usr/bin/jdb (jdb) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jdeprscan para proveer /usr/bin/jdeprscan (jdeprscan) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jdeps para proveer /usr/bin/jdeps (jdeps) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jfr para proveer /usr/bin/jfr (jfr) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jhsdb para proveer /usr/bin/jhsdb (jhsdb) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jimage para proveer /usr/bin/jimage (jimage) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jinfo para proveer /usr/bin/jinfo (jinfo) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jlink para proveer /usr/bin/jlink (jlink) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jmap para proveer /usr/bin/jmap (jmap) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jmod para proveer /usr/bin/jmod (jmod) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jpackage para proveer /usr/bin/jpackage (jpackage) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jps para proveer /usr/bin/jps (jps) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jrunscript para proveer /usr/bin/jrunscript (jrunscript) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jshell para proveer /usr/bin/jshell (jshell) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jstack para proveer /usr/bin/jstack (jstack) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jstat para proveer /usr/bin/jstat (jstat) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jstatd para proveer /usr/bin/jstatd (jstatd) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/jwebserver para proveer /usr/bin/jwebserver (jwebserver) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/keytool para proveer /usr/bin/keytool (keytool) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/rmiregistry para proveer /usr/bin/rmiregistry (rmiregistry) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/bin/serialver para proveer /usr/bin/serialver (serialver) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64 para proveer /usr/java/jdk-21-oracle-x64 (java_jdk_21_oracle) en modo automático
update-alternatives: utilizando /usr/lib/jvm/jdk-21.0.7-oracle-x64/lib/jexec para proveer /usr/bin/jexec (jexec) en modo automático

A continuación verificamos la instalación de Java comprobando que funciona en nuestro sistema y confirmando que es la versión Java de Oracle.

$ java --version
java 21.0.7 2025-04-15 LTS
Java(TM) SE Runtime Environment (build 21.0.7+8-LTS-245)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.7+8-LTS-245, mixed mode, sharing)

Es posible que haya instalado varias versiones de Java en su sistema, puede cambiar y elegir una versión distinta.

Después de ejecutar este comando, verá una lista de todas las versiones de Java instaladas, seleccione la que quiere utilizar por defecto:

$ sudo update-alternatives --config java

Existen 2 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            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      modo manual
  2            /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: 0

 

Simplemente ingrese un número de selección para elegir qué ejecutable de Java debe usarse de forma predeterminada.

Configurar las variables de entorno en Java en Debian Linux

  • JAVA_HOME se utiliza para decirle a tu sistema dónde está instalado el JDK.

  • PATH se configura para que puedas acceder a los ejecutables de Java sin proporcionar rutas completas cada vez.

  • CLASSPATH ayuda a la JVM a ubicar clases y librerías necesarias para correr tus aplicaciones.

En este punto, debe configurar las variables de entorno Java en su ordenador con linux. Para hacer esto, puede usar el siguiente comando:

$ cat <<EOF | sudo tee /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin 
export CLASSPATH=.:$JAVA_HOME/lib
EOF
export JAVA_HOME=/usr/java/default
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/bin export CLASSPATH=.:/lib

Luego, aplique los cambios obteniendo su archivo con el siguiente comando:

$ source /etc/profile.d/jdk.sh

Comprobamos la creación del script de variables de entorno en Java.

$ cd /etc/profile.d/ 
$ ls jdk.sh
jdk.sh

Comprobamos que funciona el JDK Oracle y contesta el compilador y el intérprete de programas java.

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>.

 

Eliminar jdk 17

En caso de querer desinstalar el Oracle JDK Java 21 del sistema, introduciremos este comando:

$ sudo dpkg -r jdk-17_linux-x64_bin.deb 
$ cd /etc/profile.d/ 
$ rm jdk.sh

Conclusión

Java SE 21 (LTS) marca un antes y un después en la evolución de la plataforma Java. Con su soporte a largo plazo, no solo se asegura la estabilidad y seguridad que requieren los proyectos empresariales, sino que también promueve la adopción de innovaciones que impulsan el rendimiento y la escalabilidad. La inclusión definitiva de los hilos virtuales y las nuevas colecciones secuenciadas abren nuevas posibilidades para la construcción de aplicaciones concurrentes y robustas. En conjunto, estas mejoras consolidan a Java como un lenguaje moderno, flexible y preparado para afrontar los desafíos de un entorno tecnológico en constante cambio.

Resumen

En resumen, Java SE 21 (LTS) es una versión revolucionaria que aporta:

  • Un soporte a largo plazo garantizado para aplicaciones críticas.

  • Grandes innovaciones tecnológicas como los hilos virtuales y colecciones secuenciadas.

  • Mejoras en el lenguaje y actualizaciones en el JDK que optimizan el rendimiento y simplifican el desarrollo.

Estas características hacen de Java SE 21 una herramienta imprescindible para desarrolladores que buscan combinar estabilidad con las últimas tendencias tecnológicas, reafirmando la posición de Java como una plataforma fundamental en el desarrollo de software moderno.

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 +info...
FinalidadGestionar y moderar tus comentarios. +info...
LegitimaciónConsentimiento del interesado. +info...
DestinatariosAutomattic Inc., EEUU para filtrar el spam. +info...
DerechosAcceder, rectificar y cancelar los datos, así como otros derechos. +info...
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