java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer


85

Tôi đang cố gắng tạo một ứng dụng hello world đơn giản trong hai ngày bằng cách sử dụng công cụ ứng dụng Jersey + Google. Đối với dự án AppEngine đơn giản, tôi đã làm theo các hướng dẫn này và cả hai đều hoạt động tốt https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Nhưng bây giờ tôi đang cố gắng thêm Jersey và làm theo hướng dẫn này http://www.vogella.com/articles/REST/article.html .

Nhưng máy chủ vẫn cho tôi

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

khi tôi thêm những dòng này vào web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

Tôi đã tải xuống Jersey JAX-RS 2.1 RI bundletừ đây và đã thêm tất cả các tệp jar trong WEB-INF/libthư mục như được mô tả trong hướng dẫn. Và thậm chí sau hai ngày không có gì hoạt động. Tôi đã tìm kiếm vài lần trên Google và dường như những người đang sử dụng Maven đã giải quyết được nó bằng cách nào đó nhưng tôi không sử dụng Maven, người viết hướng dẫn đó cũng vậy.

Chỉ để kiểm tra xem thậm chí com.sun.jersey.spi.container.servlet.ServletContainercó tồn tại trong nhập khẩu hay không, Jersey jarstôi đã cố gắng chỉ viết tên đủ điều kiện này bằng Java và để tên intellisense kết thúc nhưng tôi không thể nhận được bất kỳ intellisense nào sau com.sun.jeđó nên dự đoán cuối cùng của tôi là đã có một số sắp xếp lại gói trong bản dựng Jersey mới nhất và jerseykhông còn bên trong com.sun. Tôi kiệt sức và tôi sẽ đánh giá cao bất kỳ sự giúp đỡ nào.


Bạn đã cài đặt Jersey như thế nào? Tôi không thể truy cập bất kỳ thứ gì bên dưới phiên bản 2.29 và bài báo nói về 2.11?
pixel

Câu trả lời:


154

Bạn đã tải xuống Jersey 2 (RI của JAX-RS 2). Hướng dẫn bạn đang tham khảo sử dụng Jersey 1. Tải xuống Jersey 1.17.1 từ ( tại đây ), sẽ là đủ cho bạn.

Jersey 1 sử dụng com.sun.jerseyvà Jersey 2 sử dụng org.glassfish.jerseydo đó ngoại lệ.

Cũng lưu ý rằng cũng init-parambắt đầu bằng com.sun.jerseysẽ không được Jersey 2 nhận dạng.

Biên tập

Đăng ký Tài nguyên và Nhà cung cấp ở Jersey 2 chứa thông tin bổ sung về cách đăng ký các lớp / phiên bản ở Jersey 2.


2
+1. Như một sự bổ sung cho những người khác với vấn đề tương tự, nó sẽ hữu ích để đọc Jersey tài khoản chính thức Hướng dẫn: Chương 4. Triển khai một RESTful Web Service
informatik01

6
lớp mới cho servlet-container là "org.glassfish.jersey.servlet.ServletContainer"
cljk 14/01

4
servlet-class: org.glassfish.jersey.servlet.ServletContainer, init-param-name: jersey.config.server.provider.packages.
picmate 涅

1
Câu trả lời này giải thích rõ lý do cho sự cố / lỗi, nhưng vẫn để ngỏ giải pháp. Bởi vì, với thông tin ít ỏi mà bạn cung cấp, tôi không thể giải quyết vấn đề của mình. Một số chi tiết khác về tệp pom.xml, web.xml và java có thể thực hiện công việc tốt hơn. Hoặc tham khảo một blog hoặc bài viết mà hướng dẫn người đọc vào một hướng dẫn cho Jersey 2.x
Paulo Oliveira

1
@Siddharth bài viết được liên kết được cho là sẽ chỉ ra một số cách tiếp cận để giải quyết vấn đề. Nếu bạn thấy thiếu một số thông tin trong bài viết đó, hãy cho tôi biết. Hoặc bạn luôn có thể cung cấp giải pháp của mình như một câu trả lời cho câu hỏi này.
Michal Gajdos

34

Nếu bạn đang sử dụng jersey 2.x thì bạn cần cấu hình khác trong web.xml vì lớp servlet được thay đổi trong đó. bạn có thể cập nhật web.xml của mình với cấu hình sau.

    <servlet>
    <servlet-name>myrest</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>your.package.path</param-value>
    </init-param>
    <init-param>
     <param-name>unit:WidgetPU</param-name>
     <param-value>persistence/widget</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>myrest</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

9
Bạn có thực sự cần đơn vị: WidgetPU ? Tôi nghĩ rằng câu trả lời có thể được đơn giản hóa bằng cách loại bỏ nó.
Nikita Bosik,

1
Thông số này không liên quan đến đơn vị <init-param> <param-name> Jersey: WidgetPU </param-name> <param-value> Persence / widget </param-value> </init-param>
vaquar khan

22

Thêm cái này vào pom

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
</dependency>

2
jersey-core là một sự phụ thuộc của jersey-server và nhiều không cần thiết để thêm explicitely
Kalpesh Soni

OK, những gì đã xảy ra với chúng tôi là chúng tôi đã cập nhật jersey-server từ 1.0.2 lên 1.11 và lớp "ServletContainer" đột nhiên AWOL. Có vẻ như nó đã được chuyển trong phiên bản đó và các phiên bản trong tương lai sang gói jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

Đó là vấn đề thiết lập nhật thực, không phải vấn đề Jersey.

Từ luồng này ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Nhấp chuột phải vào Thuộc tính dự án nhật thực của bạn -> Hợp đồng triển khai -> Thêm -> Mục nhập đường dẫn xây dựng Java -> Phụ thuộc Gradle -> Kết thúc.

Vì vậy, Eclipse đã không sử dụng các phụ thuộc Gradle khi Apache đang khởi động.


1
Đã dành rất nhiều thời gian cho vấn đề này, đã tiết kiệm một ngày của tôi!
Tushar Thakur

3

thử đi :

org.glassfish.jersey.servlet.ServletContainer

trên lớp Servlet


2

Tôi đã gặp vấn đề tương tự như bạn mặc dù tôi đã làm theo một hướng dẫn khác: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Điều kỳ lạ là, trong hướng dẫn này tôi đã sử dụng, tôi sẽ không gặp bất kỳ vấn đề nào về khả năng tương thích giữa các phiên bản (1.x so với 2.x) bởi vì theo hướng dẫn bạn sử dụng jersey 1.8.x trên pom.xmlvà trong phần web.xmlmà bạn tham khảo một lớp ( com.sun.jersey.spi.container.servlet.ServletContainer) như đã nói trước đây của phiên bản 1.x. Vì vậy, như tôi có thể suy ra điều này sẽ hoạt động.

Tôi đoán là vì tôi đang sử dụng JDK 1.7, lớp này không tồn tại nữa.


Sau khi, tôi đã cố gắng giải quyết bằng các câu trả lời trước của mình, nhưng không giúp được gì, tôi đã thực hiện các thay đổi trên pom.xmlvà trên web.xmllỗi đã thay đổi thành:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Mà lẽ ra phải tồn tại!

Do lỗi này, tôi đã tìm thấy giải pháp "mới": http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Với Maven (archetypes), tạo một dự án áo đấu, như thế này:

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0

Và nó đã làm việc cho tôi! :)


2

Tôi cũng phải đối mặt với một vấn đề tương tự. Giải quyết vấn đề bằng cách xem qua hướng dẫn từng bước từ liên kết bên dưới.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/

  • Điều chính cần lưu ý là các thư viện áo phải được đặt chính xác trong thư mục TOMCAT WEB-INF / lib. Nó được thực hiện tự động bởi các cài đặt Eclipse được đề cập trong liên kết ở trên. Nó sẽ tạo một tệp WAR với các tệp JAR phụ thuộc. Nếu không, bạn sẽ gặp sự cố với ClassNotFound Exception.

apache-tomcat-7.0.56-windows-x64 \ apache -tomcat-7.0.56 \ webapps \ JerseyJSONExample \ WEB-INF \ lib

"23/11/2014 12:06 AM 130.458 jersey-client-1.9.jar

23/11/2014 12:06 AM 458.739 jersey-core-1.9.jar

23/11/2014 12:06 AM 147,952 jersey-json-1.9.jar

23/11/2014 12:06 AM 713.089 jersey-server-1.9.jar "4 (Các) tệp 1.450.238 byte

  • Hướng dẫn thứ hai giải thích về cách tạo một Webservice tạo và sử dụng đầu ra JSON.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

Cả hai liên kết đều cho một bức tranh tốt về cách mọi thứ hoạt động và tiết kiệm rất nhiều thời gian.


1

Chúng tôi gặp lỗi này do sự cố đường dẫn xây dựng. Bạn nên thêm các thư viện " Server Runtime " trong Build Path.

"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"

Vui lòng làm theo các bước dưới đây để giải quyết lớp không tìm thấy ngoại lệ.

Nhấp chuột phải vào project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

Tôi đã gặp phải lỗi tương tự hôm nay mặc dù tôi đang sử dụng Jersey 1.x và có đúng lọ trong classpath của mình. Đối với những người muốn làm theo hướng dẫn vogella về chữ cái và sử dụng các lọ 1.x, bạn cần thêm các thư viện áo vào thư mục WEB-INF / lib. Điều này chắc chắn sẽ giải quyết vấn đề.


Tôi gặp lỗi tương tự (sử dụng phiên bản 1.18.1 của jersey-server, jersey-core, jersey-servlet) nhưng đồ tạo tác bị nổ mà IntelliJ Idea tạo là một thư mục WEB-INF duy nhất với thư mục lớp bên trong và tệp web.xml. thư mục chỉ chứa các Hello.class
skiabox

0

bạn cần thêm jersey-bundle-1.17.1.jarvào lib của dự án

<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> --> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <!-- <param-name>jersey.config.server.provider.packages</param-name> --> <param-value>package.package.test</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>


0

Bạn phải thay thế trong web.xml của mình:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

cho điều này:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

đây là Jersey 2.x sử dụng gói org.glassfish.jersey thay vì com.sun.jersey (được sử dụng bởi Jersey 1.x) và do đó ngoại lệ. Lưu ý rằng init-param bắt đầu bằng com.sun.jersey sẽ không được Jersey 2.x nhận dạng khi bạn chuyển sang JAX-RS 2.0 và Jersey 2.x

nếu bất cứ lúc nào bạn sử dụng maven, pom.xml của bạn sẽ là:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.X</version>
</dependency>

thay thế 2.X cho phiên bản mong muốn của bạn, ví dụ: 2.15


0

Một cách giải quyết đơn giản là, hãy kiểm tra xem bạn có phụ thuộc hoặc lib trong lắp ráp triển khai của eclipse hay không. Có thể nếu bạn đang sử dụng tomcat, máy chủ có thể không xác định được lib mà chúng tôi đang sử dụng. trong trường hợp đó chỉ định nó một cách rõ ràng trong hợp ngữ triển khai.


0

Quay lại vấn đề ban đầu - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Như đã nói ở trên, trong phiên bản JAX 2.x, lớp ServletContainer đã được chuyển đến gói - org.glassfish.jersey.servlet.ServletContainer. Bình liên quan là jersey-container-servlet-core.jar được đóng gói trong jaxrs-ri-2.2.1.zip

JAX RS có thể được xử lý mà không cần mvn bằng cách sao chép thủ công tất cả các lọ chứa trong tệp zip jaxrs-ri-2.2.1.zip (tôi đã sử dụng phiên bản này, sẽ hoạt động với bất kỳ phiên bản 2.x nào) vào thư mục WEB-INF / lib. Sao chép libs vào thư mục bên phải làm cho chúng có sẵn trong thời gian chạy.

Điều này là bắt buộc nếu bạn đang sử dụng eclipse để xây dựng và triển khai dự án của mình.


0

Trong tệp pom.xml, chúng tôi cần thêm

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>

0

Cùng một lỗi và lãng phí hơn 2 giờ gỡ lỗi và thử tất cả các tùy chọn. Tôi không sử dụng Maven / POM, vì vậy tôi không thể tận dụng giải pháp được đưa ra bởi một số ít.

Cuối cùng, những điều sau đây đã giải quyết được nó: Thêm trực tiếp các lọ vào thư mục tomcat / lib (KHÔNG PHẢI WEB-INF \ lib) và khởi động lại tomcat.


0

Nếu ai đó đang cố gắng xây dựng một ứng dụng hello world bằng Jersey, tôi nghĩ một trong những cách dễ nhất là làm theo tài liệu của Jersey.

https://jersey.github.io/download.html

Nếu bạn đang sử dụng maven, sẽ chỉ mất vài phút để xem kết quả.

Tôi đã sử dụng bên dưới.

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26

0

Về cơ bản, nó phụ thuộc vào phiên bản áo bạn đang sử dụng. Nếu bạn đang sử dụng Jersey ver.1.XX, bạn cần thêm

Jersey 1 sử dụng " com.sun.jersey " và Jersey 2 sử dụng org.glassfish . trên thẻ lớp servlet. Ngoài ra, lưu ý rằng init-param bắt đầu bằng com.sun.jersey sẽ không được Jersey 2 nhận dạng.

Và Thêm tất cả tệp jar vào thư mục WEB-INF lib

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.