Retos técnicos

Los problemas que suelen bloquear un backend Java

Situaciones que se repiten en aplicaciones empresariales con años encima. Cada una explica qué se analiza antes de tocar nada y qué suele salir mal cuando no se hace.

Son páginas para entender el problema. Si ya lo tienes claro y lo que buscas es quién lo ejecute, están los servicios.

Los mensajes que suelen traer a alguien hasta aquí

Cada uno es el síntoma visible de un problema de fondo distinto. Aquí está la causa en una línea; el desarrollo, en la página que corresponde.

NoClassDefFoundError: javax/xml/bind/JAXBContext

Causa: JAXB dejó de venir en el JDK a partir de Java 11 y no hay implementación que cargar en ejecución.

Qué se hace: Es un síntoma de un cambio de versión del JDK: qué arrastra actualizar la versión de Java.

package javax.persistence does not exist

Causa: El proyecto ya usa dependencias jakarta pero quedan importaciones sin convertir, o al revés.

Qué se hace: Es el cambio de espacio de nombres: cómo se migra de Java EE a Jakarta EE.

InaccessibleObjectException: module java.base does not opens java.lang

Causa: Una librería accede por reflexión a clases internas del JDK, y desde Java 16 eso es un error y no un aviso.

Qué se hace: Sale al subir de versión y se resuelve actualizando la librería: actualización de versiones de Java.

ClassNotFoundException: javax.servlet.Filter al arrancar Spring

Causa: La aplicación corre sobre Spring 6, que ya es jakarta, con alguna dependencia todavía en la variante antigua.

Qué se hace: Es el salto de Spring Boot 2 a 3: qué implica la migración hacia Spring Boot.

UnsupportedClassVersionError: class file version 61.0

Causa: El entorno que ejecuta la aplicación usa un JDK más antiguo que el que la compiló.

Qué se hace: Casi siempre indica que el servidor marca el techo real: qué se analiza antes de modernizar.

Qué hay detrás de lo que se nota desde fuera

Los síntomas que llegan a una reunión rara vez se describen en términos técnicos. Esta es la traducción.

Síntoma percibido, causa habitual y página que lo desarrolla
Lo que se dice en la reuniónLo que suele serDónde se explica
No podemos actualizar esa libreríaLa versión de Java se quedó atrás y ya no hay versiones compatiblesActualización de versiones Java
El proveedor se fue y nadie toca ese móduloNo hay pruebas ni documentación, así que ningún cambio es verificableJava Legacy
Cada despliegue ocupa un fin de semanaProblema de arquitectura y de pruebas, no de despliegueJava Legacy
Queremos microserviciosCasi siempre es necesidad de desplegar por partes, que se resuelve antesMigración a Spring Boot
Hay que certificar el servidor y ya no da soporteEl salto de espacio de nombres viene incluido en el cambioJava EE a Jakarta EE

En qué orden se abordan cuando aparecen los cuatro a la vez

Es lo más habitual, y el orden importa: invertirlo obliga a repetir trabajo ya hecho.

  1. Primero, las pruebas

    Antes de mover una versión hay que poder demostrar que el comportamiento se mantiene. Sin esa red, todo lo que viene después es adivinar.

  2. Después, la versión de Java

    Condiciona todo lo demás: el servidor que se puede usar, las versiones de framework disponibles y qué dependencias siguen publicando. Es el techo real del proyecto.

  3. Luego, el espacio de nombres

    El paso de javax a jakarta afecta al artefacto entero y no admite estados intermedios, así que conviene hacerlo cuando la versión de Java ya está decidida.

  4. Por último, el framework y la arquitectura

    Spring Boot 3 exige las dos cosas anteriores resueltas. Intentarlo antes obliga a deshacer y rehacer la mitad del trabajo.

Cuando el problema no es técnico

A veces el inventario sale limpio: la versión es reciente, las dependencias están al día y el código es razonable. Y aun así nadie se atreve a desplegar un viernes.

En esos casos lo que falta no es una migración, sino saber qué hace el sistema. Puede ser que no haya nadie que conozca las reglas de negocio, que no exista un responsable funcional a quien preguntar, o que las pruebas ejecuten código sin comprobar comportamiento.

Eso no se arregla subiendo de versión, y conviene detectarlo antes de presupuestar una modernización que no resolvería el problema real.

Preguntas frecuentes

Preguntas que se repiten en los cuatro casos

¿Por cuál de los cuatro hay que empezar?

Por el que bloquee al resto, que casi siempre es la versión de Java. El análisis inicial sirve precisamente para ordenarlos por impacto en lugar de por urgencia percibida.

¿Se pueden abordar varios a la vez?

Es mejor no hacerlo. Cuando fallan dos cambios simultáneos no hay forma de saber cuál lo provocó, y el tiempo que se ahorra en calendario se pierde depurando.

¿Hace falta parar el desarrollo mientras tanto?

No, si cada fase se despliega. Una rama de migración abierta durante meses acaba en un conflicto que nadie se atreve a resolver, y ese es el escenario que se evita.

¿Y si no se sabe en qué estado está la aplicación?

Es el punto de partida más frecuente. La información sale del código, del historial del repositorio y de lo que se observa en producción: que nadie recuerde por qué se tomó una decisión no impide ver qué hace hoy el sistema.