【问题标题】:Tomcat is unable to find my Servlet and is throwing exceptions, but why?Tomcat 找不到我的 Servlet 并抛出异常,但为什么呢?
【发布时间】:2009-03-04 16:52:57
【问题描述】:

我正在尝试进入 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>

如您所见,我保持简单...但它不断抛出此异常。 Java 中的基本 Web 应用是什么样的,我缺少哪些组件?

更新

为了绝对确定它不是某种人工制品,我启动了一个新的 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,一切正常。

非常感谢您的帮助!一个很好的故障排除课程永远不会伤害任何人。

【问题讨论】:

  • 优秀的侦探作品 spligak :-)

标签: java tomcat


【解决方案1】:

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

检查用于启动 Tomcat 的 JDK 版本,然后看看您是否可以采取一些措施来协调该版本与您用于编译 servlet 的版本之间的差异。

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

【讨论】:

  • 原来是这样。我相信它是 1.6 构建和 1.5 运行 Tomcat。我解决了这个问题,一切似乎都在构建和运行良好。谢谢!
【解决方案2】:

下面的行完全是来自您的web.xml? Tomcat 找到将/myservlet 映射到名为“MyServlet”的 servlet 的 servlet 映射,但它抱怨找不到任何具有该名称的 servlet 定义。案件很重要。您提供的内容看起来正确,但请仔细检查您的 web.xml 以确保大小写正确。在目录mywebapp/WEB-INF/web.xml 中仔细检查Tomcat 使用它的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>

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

【讨论】:

    【解决方案3】:

    如果 MyServlet 类在包中,则应在 servlet-name 节点中使用包点类表示法将其列出。

    【讨论】:

    • 我当然打算改用点表示法,我只是对无法运行如此简单的应用程序感到恼火,因此在解决此问题之前我避免进行太多更改。感谢您的意见!
    【解决方案4】:

    一些提示:

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

    一般情况下,还要尝试在日志中查找更多异常。

    【讨论】:

    • 原来我遗漏了一个非常重要的异常。检查我上面的更新。
    【解决方案5】:

    会不会有旧版本的 web.xml 潜伏在某个地方,没有 &lt;servlet&gt; 块?

    也许在 tomcat 的目录中做一个find . -type f -name web.xml(或类似的窗口)?

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2017-01-18
      • 2014-04-22
      相关资源
      最近更新 更多