Tomcat не может найти мой сервлет и выдает исключения, но почему? - PullRequest
10 голосов
/ 04 марта 2009

Я пытаюсь заняться веб-разработкой на Java, но, похоже, сталкиваюсь со странной проблемой с Tomcat и чрезвычайно простым сервлетом. Журнал каталины извергает это каждый раз, когда я пытаюсь загрузить приложение:

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

Имеет приличный смысл. Кажется, он не может найти мой сервлет. Тем не менее, сервлет, кажется, находится в нужном месте. Я могу ясно видеть это в 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, какие компоненты мне не хватает?

Обновление

Чтобы быть абсолютно уверенным, что это не какой-то артефакт, я запустил свежую копию Tomcat и попробовал снова. После этого это начало появляться в файлах журнала:

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

Я сбросил свой файл .class для класса MyServlet, перестроил его с -target 1.5, перепаковал .war, и все заработало отлично.

Большое спасибо за помощь! Хороший урок в поиске неисправностей никогда никому не причиняет вреда.

Ответы [ 5 ]

17 голосов
/ 04 марта 2009

Что ж, учитывая обновленную информацию, похоже, ваша проблема в том, что компилятор, который вы использовали для своего класса, потенциально является более новой версией JDK, чем та, на которой запущен Tomcat.

Проверьте версию JDK, используемую для запуска Tomcat, и посмотрите, можете ли вы что-то сделать, чтобы согласовать различия версий между той и той, с которой вы используете компиляцию вашего сервлета.

Это должно прояснить вашу проблему.

3 голосов
/ 04 марта 2009

Строки ниже точно от вашего web.xml? Tomcat находит отображение сервлета, которое отображает /myservlet на сервлет с именем "MyServlet", но жалуется, что не может найти никакого определения сервлета с этим именем. Дело имеет значение. То, что вы указали, выглядит правильно, но дважды проверьте ваш 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>

Если это не так, дайте нам знать. Но эти имена чувствительны к регистру.

1 голос
/ 04 марта 2009

Несколько подсказок:

  • Ваш класс сервлетов расширяет HttpServlet?
  • А как насчет прав на файловую систему - возможна ли там проблема?
  • Возможно, попробуйте также переместить класс в именованный пакет (myservlet.MyServlet)

В общем, попробуйте поискать больше исключений в журналах.

1 голос
/ 04 марта 2009

Если класс MyServlet находится в пакете, вы должны перечислить его с нотацией package-dot-class в ваших узлах имени сервлета.

0 голосов
/ 04 марта 2009

Может ли быть где-то еще старая версия web.xml без блока <servlet>?

Возможно, сделать find . -type f -name web.xml (или подобное для windows) в каталогах tomcat?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...