2011-01-23 32 views
25

Tôi đã gặp vấn đề này một vài lần và chỉ vấp phải một giải pháp đáng tin cậy (bán), vì vậy tôi nghĩ sẽ đăng nó ở đây trong trường hợp nó giúp bất cứ ai khác, hoặc trong trường hợp tôi quên nó, và cũng để hỏi nếu có ai có bất kỳ ý tưởng nguyên nhân cơ bản là gì và tại sao sửa chữa của tôi hoạt động.ClassNotFoundException DispatcherServlet khi khởi chạy Tomcat (phụ thuộc Maven không được sao chép vào wtpwebapps)

Sự cố - Tôi có một ứng dụng web mùa xuân 3 mà tôi muốn sử dụng tùy chọn Chạy trên máy chủ trong Eclipse để chạy trên máy chủ Tomcat 7. Với một số dự án này chỉ hoạt động, nhưng một số có vẻ như đang ở trạng thái bị hỏng, theo đó mỗi khi máy chủ khởi động, tôi nhận được một lớp không tìm thấy: org.springframework.web.servlet.DispatcherServlet.

Sau một số cuộc điều tra tôi phát hiện ra rằng phụ thuộc maven của dự án đã không được sao chép vào WEB-INF/lib trong ${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

tôi đã cố gắng rất nhiều thứ trước khi cuối cùng nhận thấy rằng dự án đã có một cảnh báo trong bảng điều khiển vấn đề:

Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result. 

Có lẽ tôi nên nhận thấy điều này sớm hơn.

Dù sao, việc chọn tùy chọn này và thực hiện "Khắc phục nhanh" sẽ khắc phục sự cố và tôi có thể vui lòng chạy dự án của mình. Khắc phục nhanh là: "Đánh dấu mục nhập classpath nguyên được liên kết là phụ thuộc xuất bản/xuất".

Rắc rối là, mặc dù công trình này, tôi không biết ý nghĩa của nó. Tôi không thể thấy bất kỳ thay đổi rõ ràng nào trong cấu hình dự án của mình sau khi hoàn tất. Tôi rất muốn biết vấn đề thực sự là gì và nếu tôi có thể tránh nó xảy ra lần nữa. Tôi cũng muốn biết nếu có điều gì đó tôi có thể làm được (ngoài việc thực hiện sửa chữa nhanh) có thể đã sửa nó, bởi vì tôi cảm thấy như tôi đã thử mọi thứ khác.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

34

Hãy xem phần "Triển khai hội" trong thuộc tính dự án. Nội dung của trang này chỉ định cách dự án của bạn được lắp ráp vào một ứng dụng đang chạy. Đặc biệt, đây là nơi bạn có thể kiểm soát thư viện nào mà dự án của bạn tham chiếu, nên được đóng gói cùng với nó. Chọn Add -> Java Path Path Entries. Bạn sẽ có thể chọn trong số các mục xây dựng đường dẫn hiện có của bạn để bao gồm trong hội đồng.

Sửa chữa nhanh mà bạn tìm thấy đã làm điều tương tự cho bạn. Nếu bạn tò mò về những gì xảy ra dưới bìa, hãy xem tệp .classpath của bạn trước và sau khi khắc phục nhanh. Các sửa chữa nhanh chóng thẻ mục nhập classpath với một số thông tin lắp ráp.

+0

Cảm ơn! Tôi thấy nó không thể nhớ được những thứ nếu tôi không hiểu _how_ nó hoạt động, vì vậy điều này rất có thể sẽ giúp tôi tiết kiệm rất nhiều đau đớn trong tương lai. – Russell

+0

Tuyệt vời. Điều này thực sự đã giúp tôi sau khi Eclipse của tôi đột nhiên phát nổ không có lý do gì ngày hôm qua. – fforw

2

tập Kiểm tra .class và thay thế các mục sau đây

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER" />** 

với Dưới đây: -

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"> 
    <attributes> 
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/> 
    </attributes> 
</classpathentry>** 

Nó làm việc cho tôi.

+0

Không chắc bạn muốn xuất toàn bộ classpath Maven vì điều này có thể dẫn đến xung đột trên máy chủ ứng dụng cung cấp một số lọ theo mặc định (ví dụ như servlet-api-2.5.jar, jsp-api-2.1.jar, jstl-1.2.jar). Thay vào đó, mỗi jar phải được chọn từng cái một trong phần Deployment Assembly của Eclipse như đã đề cập trong câu trả lời được chấp nhận bởi Konstantin. – chrisjleu

+0

Đối với tôi đã xuất hiện, nhưng tôi vẫn nhận được NoClassDefFoundError, nhưng khi tôi đi đến vị trí. siêu dữ liệu/.plugins/org.eclipse.wst.server.core/tmp0, tôi không tìm thấy phụ thuộc maven của tôi trong Lib, bất kỳ gợi ý nào? –

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