es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema que estás enfrentando está relacionado con el cambio de nombres de paquetes de javax a jakarta en las últimas versiones de Tomcat. El paquete javax ha sido reemplazado por jakarta 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 de javax.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 archivo servlet-api.jar de la instalación de Tomcat.

Comments are closed.