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

🎥 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 como spring-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-starterspring-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: Abstracciones ChatModel, 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 encabezados X-Forwarded y reescribir Host.

  • 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() y upsertMultiple() 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.

JWT SPing Boot Starer Pack Loo

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

CURSOS JAVA Y SPRING

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

Reply

or to participate.