Tomcat无法找到我的Servlet并抛出异常,但为什么呢?

时间:2009-03-04 16:52:58

标签: java tomcat

我正在尝试进入Java Web开发,但似乎遇到了Tomcat和一个非常简单的servlet的奇怪问题。每当我尝试加载应用程序时,catalina日志就会出现这种情况:

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

体面的感觉。它似乎找不到我的servlet。但是,servlet似乎在正确的位置。我可以在 WEB-INF / classes / MyServlet.class

中清楚地看到它

作为参考,这是我目前正在使用的web.xml文件:

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

正如你所看到的,我保持简单......但它会不断抛出这个异常。一个简单的Web应用程序在Java中是什么样的,我缺少哪些组件?

更新

为了绝对确定它不是某种神器,我启动了一个新的Tomcat副本并再次尝试。这样做后,它开始出现在日志文件中:

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

我为MyServlet类转储了我的.class文件,使用-target 1.5重新构建它,重新打包.war,一切都运行良好。

非常感谢你的帮助!排除故障的好教训从不伤害任何人。

5 个答案:

答案 0 :(得分:17)

嗯,鉴于更新的信息,您的问题似乎是您用于类的编译器可能是运行Tomcat的JDK的新版本。

检查用于启动Tomcat的JDK版本,然后查看是否可以执行某些操作来协调它与您用于编译servlet的版本之间的版本差异。

这应该可以解决你的问题。

答案 1 :(得分:3)

web.xml下的完全下面的行? Tomcat找到将/myservlet映射到名为“MyServlet”的servlet的servlet映射,但是抱怨它找不到具有该名称的任何servlet定义。案件很重要。您提供的内容看起来不错,但请仔细检查web.xml以确保案例正确无误。在目录web.xml

中仔细检查Tomcat使用它的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>

如果不是,请告诉我们。但这些名称区分大小写。

答案 2 :(得分:1)

如果MyServlet类在一个包中,你应该在servlet-name节点中用package-dot-class表示法列出它。

答案 3 :(得分:1)

几点提示:

  • 你的servlet类是否扩展了HttpServlet?
  • 文件系统权限怎么样 - 那里有任何可能的问题?
  • 也许,也尝试将类移动到命名包(myservlet.MyServlet)

通常,还会尝试在日志中查找更多例外。

答案 4 :(得分:0)

是否有web.xml的旧版本潜伏在某处,没有<servlet>阻止?

也许在tomcat的目录中执行find . -type f -name web.xml(或类似于windows)?