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