2009-03-04 59 views
10

Tôi đang cố gắng để có được vào phát triển web Java nhưng dường như đang chạy vào một vấn đề kỳ lạ với Tomcat và một servlet cực kỳ đơn giản. Nhật ký catalina đang tăng tốc độ này mỗi lần tôi thử tải ứng dụng:Tomcat không thể tìm thấy Servlet của tôi và đang ném ngoại lệ, nhưng tại sao?

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 

Tạo cảm giác tốt. Nó dường như không thể tìm thấy servlet của tôi. Tuy nhiên, servlet dường như ở đúng nơi. Tôi rõ ràng có thể thấy nó ở WEB-INF/classes/MyServlet.class

Để tham khảo, đây là file web.xml Tôi hiện đang sử dụng:

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

Như bạn thấy, tôi 'giữ mọi thứ đơn giản ... nhưng nó liên tục ném ngoại lệ này. Ứng dụng web xương trần trông như thế nào trong Java, thành phần nào tôi thiếu?

Cập nhật

Để chắc chắn tuyệt đối nó không phải là một tạo tác của một số loại, tôi bắt đầu lập một bản sao mới của Tomcat và cố gắng một lần nữa. Khi làm như vậy, điều này bắt đầu xuất hiện trong các tập tin log:

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

tôi đổ tập tin .class của tôi cho lớp MyServlet, xây dựng lại nó với -target 1.5, repackaged các .WAR và tất cả mọi thứ đã làm việc một cách hoàn hảo.

Cảm ơn bạn rất nhiều vì đã giúp đỡ! Một bài học tốt trong xử lý sự cố không bao giờ làm tổn thương bất cứ ai.

+0

Tốt công việc thám tử spligak :-) – toolkit

Trả lời

17

Vâng, với thông tin cập nhật, có vẻ như vấn đề của bạn là trình biên dịch bạn sử dụng cho lớp của mình có khả năng là phiên bản mới hơn của JDK so với phiên bản chạy Tomcat.

Kiểm tra phiên bản JDK đang được sử dụng để khởi động Tomcat, và sau đó xem bạn có thể làm điều gì đó để điều chỉnh sự khác biệt giữa phiên bản đó và phiên bản bạn đang sử dụng để biên dịch servlet của mình không.

Điều đó sẽ làm rõ vấn đề của bạn.

+0

Đó là những gì nó bật ra được. Tôi tin rằng đó là 1,6 tòa nhà và 1,5 chạy Tomcat. Tôi đã khắc phục vấn đề đó và mọi thứ dường như đang xây dựng và hoạt động tốt. Cảm ơn! – spligak

0

Có thể có phiên bản cũ hơn của web.xml ẩn ở đâu đó, không có khối <servlet> không?

Có lẽ làm find . -type f -name web.xml (hoặc tương tự cho cửa sổ) trong thư mục của tomcat?

1

Nếu lớp MyServlet nằm trong gói, bạn nên liệt kê nó với ký hiệu gói-chấm trong các nút tên servlet của bạn.

+0

Tôi chắc chắn có kế hoạch chuyển sang ký hiệu chấm, tôi chỉ bị mắng bởi không có khả năng để có được một ứng dụng đơn giản chạy mà tôi tránh thay đổi quá nhiều trước khi tôi giải quyết vấn đề này. Cảm ơn các đầu vào! – spligak

3

Các dòng bên dưới chính xác là từ web.xml của bạn? Tomcat tìm thấy ánh xạ servlet ánh xạ /myservlet tới servlet có tên "MyServlet" nhưng than phiền rằng nó không thể tìm thấy bất kỳ định nghĩa servlet nào với tên đó. Trường hợp có vấn đề. Những gì bạn cung cấp có vẻ chính xác, nhưng hãy kiểm tra kỹ số web.xml của bạn để đảm bảo đúng. Hãy kiểm tra các web.xml nơi Tomcat đang sử dụng nó, trong thư mục 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> 

Nếu đó không phải là nó, cho chúng tôi biết. Nhưng những cái tên này phân biệt chữ hoa chữ thường.

1

vài gợi ý:

  • Có lớp servlet của bạn kéo dài HttpServlet?
  • Quyền về hệ thống tệp - có thể xảy ra sự cố nào không?
  • Có lẽ, cố gắng cũng để di chuyển các lớp để một gói có tên (myservlet.MyServlet)

Nói chung, cũng cố gắng tìm kiếm ngoại lệ hơn trong các bản ghi.

+0

Hóa ra có một ngoại lệ rất quan trọng mà tôi đã bỏ lỡ. Kiểm tra cập nhật của tôi ở trên. – spligak

Các vấn đề liên quan