ClassNotFoundException con ServletContextListener en Tomcat 10
Estoy tratando de construir un proyecto de aplicación web utilizando Netbeans 12.4 y Tomcat 10.0.13.
Y me sorprende ver que mi proyecto se compila bien pero el listener de contexto nunca se invoca. En cambio, veo mensajes como:
java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
Causado por: java.lang.ClassNotFoundException: javax.servlet.ServletContextListener
en los registros. Mi archivo WAR no incluye la API de servlet y las soluciones como las mencionadas en https://stackoverflow.com/questions/7849452/classnotfoundexception-with-servletcontextlistener no parecen funcionar, por lo que opté por otro camino e intenté encontrar la clase ServletContextListener en la instalación de Tomcat. Y la encontré en ${CATALINA_HOME}/lib/servlet-api.jar. Hasta ahora todo bien.
Pero cuando inspeccioné el jar más detenidamente, vi que el nombre de la clase completamente calificado es jakarta.servlet.ServletContextListener
. Alarmado, seguí buscando y encontré https://tomcat.apache.org/tomcat-10.0-doc/servletapi/index.html?jakarta/servlet/ServletContextListener.html
Esto no parece ser un fallo, ¿verdad? Pero entonces, ¿cómo se supone que debo escribir una aplicación web en Java? ¿Debo compilar con javax.servlet.XXX
o jakarta.servlet.XXX
?
davy.ai
El problema que estás enfrentando está relacionado con el cambio de nombres de paquetes de
javax
ajakarta
en las últimas versiones de Tomcat. El paquetejavax
ha sido reemplazado porjakarta
en el proyecto Jakarta EE, del cual Tomcat es parte.Para resolver el problema y escribir una aplicación web en Java, debes compilar utilizando el paquete
jakarta.servlet
en lugar dejavax.servlet
. Esto implica que debes actualizar tu código y todas las dependencias para utilizar los nuevos nombres de paquete.También puedes agregar el archivo
servlet-api.jar
de la instalación de Tomcat en el classpath de tu proyecto para resolver el problema. Sin embargo, se recomienda evitar este enfoque ya que puede causar problemas de compatibilidad en el futuro.En resumen, para escribir una aplicación web en Java con Netbeans 12.4 y Tomcat 10.0.13, debes compilar utilizando el paquete
jakarta.servlet
, actualizar tu código y dependencias para utilizar los nuevos nombres de paquete, y evitar usar el archivoservlet-api.jar
de la instalación de Tomcat.