Newsletter Java: Novedades de la Semana 3 Abril 2025
Tu newsletter semanal de Programando En Java
✨¡Bienvenidos a otra semana de Java Weekly!
Esta semana, nos encontramos con un aluvión de lanzamientos y actualizaciones que podrían hacer que incluso tu abuelita quiera aprender a programar. ¡Así que pon atención! 🔥
Redes Sociales
📘 Facebook: Programando en JAVA
🐦 X (Twitter): ProgEnJava
📸 Instagram: Programando en Java
💼 LinkedIn: Ricardo Romero Benítez
▶️ YouTube: Programando en Java
🎵 TikTok: Programando en Java
🧵 Threads: Programando en Java
💬 Discord: Comunidad de Programando en JAVA
🎥 Video de la Semana en YouTube: Diferencia entre JDK, JRE y JVM
En este video te explico cómo usarlo para ejecutar tareas de forma asíncrona, componer operaciones y manejar errores sin complicarte con hilos manuales.
✅ Ideal si trabajas con Java 8+ y quieres escribir código más limpio y eficiente.
JDK 25: Build 18 ¡Llegó para hacer ruido!
La última versión del JDK 25, conocida como Build 18, ya está lista para que la pruebes. Aquí van los highlights 📈:
Actualizaciones: Algunos bugs que podrían haber hecho que te arrancaras los pelos han sido arreglados. Puedes ver los detalles de los cambios en GitHub.
Reporte de errores: Si encuentras algo funky, ¡no dudes en apuntarlo en la Java Bug Database! ¡Haz tu parte como héroe de Java! 🦸♂️
Jakarta EE: ¡A punto de brillar!
El pro de Jakarta EE, Ivar Grimstad, nos cuenta que están muy cerca de finalizar la refactorización de la plataforma Jakarta EE 11. Los detalles:
Jakarta EE 11: Listo para revisión hacia finales de mayo. Más info en el blog de Ivar.
Jakarta EE 12: ¿Curioso por el futuro? Ve el progreso en su status board. 👀
Spring Framework
Si pensabas que Spring era solo para hacer café, piénsatelo de nuevo. Esta semana sacaron Spring AI 1.0.0 M7 y Spring Cloud 2025.0.0 M3😀
🧠 Spring AI 1.0.0-M7 ya disponible
🚀 Último milestone antes del RC1 y GA en Spring I/O Barcelona.
✨ Novedades clave
Reestructuración modular completa:
El core monolítico se divide en módulos especializados comospring-ai-model
,spring-ai-vector-store
,spring-ai-client-chat
,spring-ai-rag
, entre otros.Cambios breaking en los artefactos:
spring-ai-{model}-spring-boot-starter
→spring-ai-starter-model-{model}
Cambios similares para Vector Store y MCP.
Reorganización de paquetes para reflejar mejor las responsabilidades de cada clase.
ToolContext mejorado: Soporta herramientas implícitas y explícitas en llamadas al modelo.
🧱 Estructura modular (destacados)
spring-ai-commons
: Modelos, logging, utilidades JSON.spring-ai-model
: AbstraccionesChatModel
,EmbeddingModel
, etc.spring-ai-client-chat
: API de alto nivel para chat.spring-ai-rag
: Framework completo para Retrieval Augmented Generation.
🤖 Integraciones actualizadas
Anthropic Claude 3.7 ahora es el modelo por defecto.
Ollama: Soporte para nuevos modelos incluyendo
LLAMA3_2_3B
.Azure OpenAI y OpenAI: mejoras en opciones, headers, audio, etc.
Soporte para Docker Model Runner: Ejecuta modelos localmente con compatibilidad OpenAI.
🧰 Herramientas & Multimodalidad
Nuevo
ToolExecutionEligibilityPredicate
.Soporte para imágenes base64 en respuestas JSON.
Soporte para
JSoup
para procesar HTML.
🧠 Memoria y almacenamiento
Nuevas implementaciones de
ChatMemory
: JDBC, Cassandra, Neo4j.Soporte para vector stores como Couchbase y mejoras en Milvus y PgVectorStore.
🔧 Mejoras para desarrolladores
Mejor integración con Spring Boot.
Soporte para AOT y native image.
Diagrama de arquitectura y documentación mejorada.
📌 Ojo: Este release incluye breaking changes, por lo que se recomienda revisar la guía de migración antes de actualizar.
🌥 Spring Cloud 2025.0.0-M3 (Northfields)
🧬 Spring Cloud Stream
✅ Nuevas capacidades para crear y modificar bindings dinámicamente con
BindingsLifecycleController
.🛠 Corrección en serialización de expresiones SpEL para Actuator.
⚙️ Spring Cloud Function
Mejoras en
MessageConverterHelper
: permite forzar fallos específicos en conversiones de mensaje.Procesamiento de headers ahora case-insensitive (RFC 2616).
Corrección en la detección de tipos de funciones en Kotlin.
🧱 Spring Cloud Commons
🔧 Gestión de la versión de okhttp en
commons
.
🔐 Spring Cloud Config
El Config Server ahora procesa archivos de S3 igual que en Git, unificando comportamientos.
🌐 Spring Cloud Gateway
🚦 Nueva función de routing por defecto en funciones WebMvc.
💨 Mejora de rendimiento en limitación de velocidad (rate limiter) con Lua.
📥 Soporte para predicados de rutas con query params.
📤 Añadido header
Forwarded-by
a las peticiones.
📎 Todos los detalles y cambios están disponibles en la nota de la versión en GitHub.
🤩 ¡Tu opinión importa!
¡Ayúdame a mejorar esta newsletter!. Responde esta encuesta (menos de 1 minuto) para contarme qué temas prefieres y cómo puedo mejorarla.
WildFly 36: ¡Despegamos!
La nueva versión de WildFly llega cargada de características para que te enloquezcas:
✨ Novedades destacadas
🧪 Integraciones y extensiones innovadoras
JBang + WildFly: ahora puedes ejecutar una app de WildFly directamente desde JBang (🧪 experimental).
WildFly AI Feature Pack: sigue evolucionando rápidamente. Aún en incubación.
Micrometer + Prometheus: ahora puedes usar el Prometheus Registry para pull-based scraping de métricas (📦 estabilidad comunitaria).
🔒 Mejoras en protocolos y headers
Soporte para
remote+tls
en invocaciones remotas EJB.Mejora en el reverse proxy handler de
undertow
: ahora permite reutilizar encabezadosX-Forwarded
y reescribirHost
.AJP listener ahora acepta custom AJP request headers.
🔄 Hibernate
WildFly Preview: incluye Hibernate ORM 7 (beta) y Hibernate Search 8 (alpha).
☕ Soporte para versiones de Java
Java Version
Estado
Recomendado
SE 21
LTS + probado
✅ Sí
SE 17
LTS + probado
✅ Sí
SE 24
Funciona bien
⚠️ No LTS
SE 25 (EA)
Resultados positivos en Linux
🧪 Experimental
📄 Notas de la versión
Notas completas en GitHub
Incidencias corregidas en WildFly Core 28.0.0 están en WildFly Core JIRA
Open Liberty: ¡Beta a la vista!
La versión 25.0.0.4-beta ya está disponible y ¡viene con sorpresas!
Soporte para JDK 24: Prepárate para una experiencia más suave. Revisa lo detallado en su blog.
Hibernate: ¡Temporada de betas!
La tercera beta de Hibernate Reactive 3.0.0 presenta mejoras que te harán sonreír:
Métodos nuevos:
upsertAll()
yupsertMultiple()
para que tu vida sea más fácil. Lee más aquí.
💥 Construye tu Backend en Minutos, No en Semanas
¿Cansado de perder tiempo construyendo infraestructura? ¡Déjalo en mis manos! Con Spring Boot JWT Starter Pack podrás lanzar tu backend YA.
✅ Autenticación segura con JWT
✅ Gestión de roles sin dolor de cabeza
✅ API documentada y lista para producción
✅ Compilación nativa para rendimiento superior
🚀 Menos configuración. Más código que importa.

🎓 DOMINA Java y Spring Boot desde cero
¿Cansado de tutoriales aburridos que no van al grano? Estos cursos no son para quienes solo quieren "mirar código", sino para quienes quieren escribirlo como un PRO.

Apache Tomcat: Actualización importante
Las versiones 11.0.6 y 9.0.104 de Tomcat han llegado, así que si no quieres quedarte atrás, ¡dale un vistazo a las mejoras! Más en sus release notes.
📌 Resumen express
🔧 Mejoras de compatibilidad con classloaders y HTTP/2.
🚀 Nuevas capacidades para JSP y límites de tasa.
📚 Documentación y soporte actualizado para Java 25.
🛠️ Varias actualizaciones de dependencias y mejoras internas.
LangChain4j
La tercera beta de LangChain4j 1.0.0-beta3 trae cambios notables. Si eres de los que adolan los JSON, ¡esto es para ti! Más detalles en las release notes.
📌 Resumen express
🔥 Gran avance en outputs estructurados, observabilidad y soporte para múltiples modelos.
❌ Limpieza técnica importante con eliminación de APIs obsoletas.
⚙️ Mejoras internas clave para estabilidad, rendimiento y extensibilidad.
💡 Consejo Java: Usa Map.computeIfAbsent
para evitar null
y simplificar el código
Cuando trabajas con mapas (Map
), muchas veces necesitas verificar si una clave existe y, si no, inicializarla. Esto se puede hacer de forma elegante con computeIfAbsent
.
✅ En vez de esto:
Map<String, List<String>> map = new HashMap<>();
if (!map.containsKey("java")) {
map.put("java", new ArrayList<>());
}
map.get("java").add("Spring Boot");
🔄 Usa esto:
Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("java", k -> new ArrayList<>())
.add("Spring Boot");
🧠 ¿Por qué es mejor?
Es más conciso y legible.
Evita errores por
NullPointerException
.Encapsula lógica de inicialización de manera más limpia.
📩 Si te ha gustado esta edición, compártela con otros desarrolladores y nos vemos la próxima semana con más novedades.
¡Feliz coding! 🚀
Ricardo