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