jar không được tải. Xem Servlet Spec 2.3, mục 9.7.2. Lớp vi phạm: javax / servlet / Servlet.class


100

Tôi đang chạy một dự án Maven cũng là một dự án web động. Tôi đã sử dụng tất cả các thư viện Spring trong Maven. Tôi đã tạo web.xml, nhưng khi khởi động máy chủ Tomcat 7 của mình, tôi nhận được thông báo sau:

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Tôi đã thử xóa servlet khỏi đó webapp/lib, nhưng nó không hoạt động. Hãy cho tôi biết nên làm gì trong trường hợp của tôi.


Lưu ý rằng hành vi này là theo đặc điểm kỹ thuật của servlet. Hiểu biết đầy đủ sẽ hữu ích trong việc hiểu những vấn đề phức tạp hơn mà bạn có thể gặp phải.
Thorbjørn Ravn Andersen

Câu trả lời:


113

Tệp .jar của servlet API không được nhúng vào bên trong ứng dụng web vì rõ ràng là vùng chứa đã có các lớp này trong đường dẫn classpath của nó: nó triển khai các giao diện có trong jar này.

Sự phụ thuộc phải nằm trong providedphạm vi, thay vì compilephạm vi mặc định , trong Maven pom của bạn:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

"Sự phụ thuộc phải nằm trong phạm vi được cung cấp, thay vì phạm vi biên dịch mặc định, trong Maven pom của bạn." Làm thế nào tôi có thể làm điều đó
dreambigcoder

Xem câu trả lời đã chỉnh sửa của tôi. dọn dẹp và xây dựng ứng dụng bằng Maven, đồng thời kiểm tra xem jar servlet không nằm trong thư mục WEB-INF / lib trong ứng dụng web đã tạo.
JB Nizet

Tôi đã làm mọi thứ. nhưng tôi đang tìm thấy jar trong thư mục WEB-INF / lib. Nếu tôi xóa bình, tôi sẽ nhận được thông báo dưới đây THÔNG TIN: Khởi động Servlet Engine: Apache Tomcat / 7.0.12 Tôi có cần làm gì không?
dreambigcoder vào

6
Có thể bạn có một phụ thuộc có phụ thuộc bắc cầu vào một phiên bản jar servlet khác. Sử dụng phụ thuộc mvn: cây để tìm nơi xuất phát của jar servlet này và thêm một loại trừ.
JB Nizet

làm thế nào để làm điều tương tự cho cây thường xuân?
Dinesh Babu KG

21

Bạn nhận được thông báo cảnh báo này khi tệp jar servlet api đã được tải trong vùng chứa và bạn cố gắng tải lại từ libthư mục.

Thông số Servlet cho biết bạn không được phép có servlet.jar trong libthư mục ứng dụng web của mình .

  • Loại bỏ thông báo cảnh báo bằng cách xóa servlet.jarkhỏi libdanh bạ của bạn .
  • Nếu bạn không tìm thấy jar trong libthư mục, hãy quét đường dẫn xây dựng của bạn và xóa jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Nếu bạn đang chạy một dự án maven, hãy thay đổi sự javax.servlet-apiphụ thuộc thành phạm vi providedtrong pom.xml của bạn vì vùng chứa đã cung cấp jar servlet trong chính nó.


4

Để khắc phục điều đó, thiết lập các phạm vi để cung cấp . Điều này cho Maven biết chỉ sử dụng mã servlet-api.jar để biên dịch và thử nghiệm, nhưng KHÔNG đưa nó vào tệp WAR. Vùng chứa được triển khai sẽ “cung cấp” servlet-api.jar trong thời gian chạy.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

2

Bạn có thể thấy dòng lệnh windows sau đây hữu ích trong việc theo dõi tệp jar vi phạm. nó tạo ra một chỉ mục của tất cả các tệp lớp trong tất cả các lọ trong thư mục. Thực thi từ bên trong thư mục lib của ứng dụng đã triển khai của bạn, sau đó tìm kiếm lớp vi phạm trong tệp index.txt.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Phạm vi phụ thuộc Maven

cung cấp : Đây là giống như biên dịch, nhưng cho thấy bạn mong đợi các JDK hoặc một thùng chứa để cung cấp các phụ thuộc khi chạy. Ví dụ: khi xây dựng ứng dụng web cho Java Enterprise Edition, bạn sẽ đặt sự phụ thuộc vào API Servlet và các API Java EE liên quan thành phạm vi được cung cấpvùng chứa web cung cấp các lớp đó . Phạm vi này chỉ có sẵn trên classpath biên dịch và thử nghiệm, và không có tính bắc cầu.


1

Tôi đã vật lộn với vấn đề này và tôi đã thử nhiều "giải pháp".

Tuy nhiên, cuối cùng, cách duy nhất hoạt động và thực sự mất vài giây để làm điều đó là: xóa và thêm lại phiên bản máy chủ mới !

Về cơ bản, tôi đã nhấp chuột phải vào máy chủ Tomcat của mình trong Eclipse trong Máy chủ và xóa nó. Tiếp theo, tôi đã thêm một máy chủ Tomcat mới. Đã xóa và triển khai lại ứng dụng và tôi đã thoát khỏi lỗi này.


Nhấp chuột phải vào máy chủ của bạn -> sạch ... và sau đó một lần nữa nhấn chuột phải vào máy chủ của bạn -> sạch thư mục làm việc tomcat cố định nó cho tôi
kiltek

0

Kiểm tra Bên trong Thư mục Sau để tìm tệp jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar nếu nó tồn tại thì trong thư mục này của ứng dụng web WEB-INF \ lib \ el-api.jar cái lọ nên được lấy ra


0

khi mẫu URL của bạn sai, lỗi này có thể xảy ra.

ví dụ. Nếu bạn đã viết @WebServlet ("đăng nhập"), lỗi này sẽ được hiển thị. Địa chỉ chính xác là @WebServlet ("/ login").


0

Loại trừ và providedphụ thuộc sẽ không hoạt động trong các dự án con.

Nếu bạn đang sử dụng kế thừa trong các dự án Maven, bạn phải đưa cấu hình này vào pom.xmltệp mẹ . Bạn sẽ có một <parent>...</parent>phần trong pom.xml của mình nếu bạn đang sử dụng tính năng thừa kế . Vì vậy, bạn sẽ có một cái gì đó như thế này trong cha mẹ của bạn pom.xml:

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

0

Thư viện phụ thuộc JAX-WS “jaxws-rt.jar” bị thiếu.

Truy cập vào đây http://jax-ws.java.net/ . Tải xuống bản phân phối JAX-WS RI. Giải nén nó và sao chép “jaxws-rt.jar” vào thư mục thư viện Tomcat “{$ TOMCAT} / lib“. Khởi động lại Tomcat.


0

Điển hình khi bạn nhìn thấy thông báo này, đó là điều lành tính. Nếu nó nói

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Nó có nghĩa là nó đang bỏ qua servlet-api-2.5.jar của bạn bởi vì tomcat đã có phiên bản tích hợp của jar đó, vì vậy nó sẽ không sử dụng của bạn. Thông thường, điều này không gây ra sự cố.

Tuy nhiên, nếu nó nói WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

sau đó những gì bạn có thể làm (trong trường hợp của tôi, đó là một cái lọ bóng mờ) sẽ chạy

$ mvn phụ thuộc: cây

và phát hiện ra rằng bạn có phụ thuộc bắc cầu vào "cái gì đó" phụ thuộc vào một jar là servlet-api hoặc một cái gì đó tương tự như nó (ví dụ tomcat-servlet-api-9.0.0:). Vì vậy, hãy thêm một loại trừ cho điều đó vào pom của bạn, ví dụ: (trong trường hợp của tôi là tomcat, trong trường hợp của bạn, có thể là những cái được đề cập trong các câu trả lời khác):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

-4

Xóa servlet.jarkhỏi web-inf/libthư mục nguồn vì nó có sẵn trong libthư mục tomcat sau đó nó hoạt động tốt


1
Câu trả lời này không thêm bất cứ điều gì chưa có trong câu trả lời này .
Glorfindel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.