2009-03-04 7 views
10

Estoy tratando de entrar en el desarrollo web de Java, pero parece que se está encontrando con un problema extraño con Tomcat y un servlet extremadamente simple. El registro de catalina está escupiendo esto cada vez que intento cargar la aplicación:Tomcat no puede encontrar mi Servlet y está lanzando excepciones, pero ¿por qué?

Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name MyServlet 
    at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2393) 
    at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2373) 
    ... 40 more 
Mar 4, 2009 10:37:58 AM org.apache.catalina.startup.ContextConfig applicationWebConfig 
SEVERE: Parse error in application web.xml file at jndi:/localhost/mywebapp/WEB-INF/web.xml 
java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name MyServlet 

Tiene sentido decente. Parece que no puede encontrar mi servlet. Sin embargo, el servlet parece estar en el lugar correcto. claramente lo puedo ver en WEB-INF/classes/MyServlet.class

Como referencia, este es el archivo web.xml Actualmente estoy usando:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 
    <description>My first web app in Java.</description> 
    <display-name>My Web App</display-name> 

    <servlet> 
     <servlet-name>MyServlet</servlet-name> 
     <servlet-class>MyServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>MyServlet</servlet-name> 
     <url-pattern>/myservlet</url-pattern> 
    </servlet-mapping> 
</web-app> 

Como se puede ver, Estoy manteniendo las cosas simples ... pero arroja continuamente esta excepción. ¿Qué aspecto tiene una aplicación web básica en Java? ¿Qué componentes me faltan?

actualización

para estar absolutamente seguro de que no era un artefacto de algún tipo, que puso en marcha una nueva copia de Tomcat y volvió a intentarlo. Al hacerlo, este comenzó a aparecer en los archivos de registro:

SEVERE: Error deploying web application archive mywebapp.war 
java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class MyServlet) 

Me deshice de mi archivo .class para la clase MyServlet, reconstruida con -target 1.5, reenvasado el .war y todo funcionaba perfectamente.

¡Muchas gracias por la ayuda! Una buena lección de solución de problemas nunca lastima a nadie.

+0

Bueno trabajo de detective spligak :-) – toolkit

Respuesta

17

Bueno, dada la información actualizada, parece que su problema es que el compilador que utilizó para su clase es potencialmente una versión más nueva del JDK que la que ejecuta Tomcat.

Compruebe la versión de JDK que se utiliza para iniciar Tomcat, y luego vea si puede hacer algo para reconciliar las diferencias de versión entre esa y la que está utilizando para compilar su servlet.

Eso debería aclarar su problema.

+0

Eso es lo que resultó ser. Creo que fue 1.6 build y 1.5 ejecutando Tomcat. Solucioné ese problema y todo parece estar funcionando bien. ¡Gracias! – spligak

0

¿Podría haber una versión anterior de web.xml al acecho en algún lugar, sin el bloque <servlet>?

Quizás haga un find . -type f -name web.xml (o similar para windows) en los directorios de tomcat?

1

Si la clase MyServlet está en un paquete, debe enumerarla con la notación package-dot-class en los nodos de nombre de servlet.

+0

Ciertamente planeo pasar a una notación de punto, simplemente me molestó mi incapacidad para ejecutar una aplicación tan simple que evité cambiar demasiado antes de resolver este problema. ¡Gracias por el aporte! – spligak

3

Son las líneas por debajo de exactamente desde su web.xml? Tomcat encuentra el mapeo de servlet que mapea /myservlet al servlet llamado "MyServlet" pero se queja de que no puede encontrar ninguna definición de servlet con ese nombre. El caso importa Lo que proporcionó parece correcto, pero vuelva a verificar su web.xml para asegurarse de que el caso sea el correcto. Vuelva a comprobar la web.xml donde Tomcat está utilizando, en el directorio mywebapp/WEB-INF/web.xml

<servlet> 
    <servlet-name>MyServlet</servlet-name> <-- Check this name 
    <servlet-class>MyServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> <-- Compare against this name 
    <url-pattern>/myservlet</url-pattern> 
</servlet-mapping> 

Si no es así, vamos a saber. Pero estos nombres son sensibles a mayúsculas y minúsculas.

1

algunos consejos:

  • ¿Su clase servlet se extienden HttpServlet?
  • ¿Qué hay de los derechos del sistema de archivos? ¿Existe algún problema allí?
  • Tal vez, también tratar de mover la clase a un paquete llamado (myservlet.MyServlet)

En general, también tratar de buscar más excepciones en los registros.

+0

Resulta que hubo una excepción muy importante que me faltaba. Verifique mi actualización arriba. – spligak

Cuestiones relacionadas