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


86

ฉันกำลังพยายามสร้างแอปพลิเคชัน hello world ที่เรียบง่ายเป็นเวลาสองวันโดยใช้แอป Jersey + Google สำหรับโครงการ AppEngine อย่างง่ายฉันทำตามบทช่วยสอนเหล่านี้และทั้งสองอย่างก็ใช้ได้ดี https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

แต่ตอนนี้ฉันกำลังพยายามที่จะเพิ่มย์และต่อไปนี้การกวดวิชาhttp://www.vogella.com/articles/REST/article.html

แต่เซิร์ฟเวอร์ให้ฉัน

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

เมื่อฉันเพิ่มบรรทัดเหล่านี้ใน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>

ฉันดาวน์โหลด Jersey JAX-RS 2.1 RI bundleจากที่นี่และได้เพิ่มไฟล์ jar ทั้งหมดในWEB-INF/libโฟลเดอร์ตามที่อธิบายไว้ในบทช่วยสอน และหลังจากสองวันก็ไม่มีอะไรทำงาน ฉันค้นหาหลายครั้งใน Google และเห็นได้ชัดว่าผู้ที่ใช้ Maven ได้แก้ไขปัญหานี้แล้ว แต่ฉันไม่ได้ใช้ Maven คนที่เขียนบทช่วยสอนนั้นก็ไม่ได้

เพียงเพื่อตรวจสอบว่าcom.sun.jersey.spi.container.servlet.ServletContainerมีอยู่ในการนำเข้าหรือไม่ Jersey jarsฉันพยายามเขียนชื่อที่มีคุณสมบัติครบถ้วนนี้ใน Java และปล่อยให้ Intellisense เสร็จสิ้นชื่อ แต่ฉันไม่สามารถรับ intellisense ใด ๆ ได้หลังจากcom.sun.jeนั้นดังนั้นการคาดเดาครั้งสุดท้ายของฉันคือมีการจัดเรียงแพ็คเกจใหม่ในการสร้าง Jersey ล่าสุด และจะไม่มีอีกต่อไปภายในjersey com.sunฉันเหนื่อยและขอขอบคุณสำหรับความช่วยเหลือใด ๆ


คุณติดตั้ง Jersey ได้อย่างไร? ฉันไม่สามารถเข้าถึงสิ่งที่อยู่ด้านล่างเวอร์ชัน 2.29 และบทความพูดถึง 2.11?
พิกเซล

คำตอบ:


156

คุณได้ดาวน์โหลด Jersey 2 (ซึ่ง RI ของ JAX-RS 2) บทช่วยสอนที่คุณอ้างถึงใช้ Jersey 1 ดาวน์โหลด Jersey 1.17.1 จาก ( ที่นี่ ) น่าจะเพียงพอสำหรับคุณ

ใช้ Jersey 1 com.sun.jerseyและ Jersey 2 ใช้org.glassfish.jerseyด้วยเหตุนี้ข้อยกเว้น

โปรดทราบว่าJersey 2 จะไม่รู้จักการinit-paramเริ่มต้นด้วยcom.sun.jersey

แก้ไข

การลงทะเบียนทรัพยากรและผู้ให้บริการใน Jersey 2มีข้อมูลเพิ่มเติมเกี่ยวกับวิธีการลงทะเบียนคลาส / อินสแตนซ์ใน Jersey 2


2
+1. นอกจากนี้สำหรับผู้อื่นที่มีปัญหาคล้าย ๆ กันการอ่านคู่มือผู้ใช้ Jersey อย่างเป็นทางการ: บทที่ 4 การปรับใช้บริการเว็บ RESTful
informatik01

6
คลาสใหม่สำหรับ servlet-container คือ "org.glassfish.jersey.servlet.ServletContainer"
cljk

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

1
คำตอบนี้อธิบายถึงสาเหตุของปัญหา / ข้อผิดพลาดได้เป็นอย่างดี แต่ปล่อยให้วิธีแก้ปัญหาเปิดกว้างมาก เนื่องจากข้อมูลเพียงเล็กน้อยที่คุณให้มาฉันไม่สามารถแก้ไขปัญหาของฉันได้ รายละเอียดเพิ่มเติมเกี่ยวกับไฟล์ pom.xml, web.xml และ java สามารถทำงานได้ดีกว่า หรืออ้างอิงบล็อกหรือบทความที่แนะนำผู้อ่านในการสอนสำหรับ Jersey 2.x
Paulo Oliveira

1
@Siddharth บทความที่เชื่อมโยงควรจะแสดงวิธีการบางอย่างในการแก้ปัญหา หากคุณพบข้อมูลบางอย่างในบทความนั้นขาดหายไปโปรดแจ้งให้เราทราบ หรือคุณสามารถให้คำตอบสำหรับคำถามนี้ได้ตลอดเวลา
Michal Gajdos

34

หากคุณใช้เจอร์ซีย์ 2.x คุณจำเป็นต้องมีการกำหนดค่าที่แตกต่างกันใน web.xml เนื่องจากคลาส servlet จะเปลี่ยนไป คุณสามารถอัปเดต web.xml ของคุณด้วยการกำหนดค่าต่อไปนี้

    <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
คุณต้องการหน่วย: WidgetPU จริงหรือ? ฉันคิดว่าคำตอบสามารถทำให้ง่ายขึ้นได้โดยการลบออก
Nikita Bosik

1
พารามิเตอร์นี้ไม่เกี่ยวข้องกับ Jersey <init-param> <param-name> unit: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan

22

เพิ่มสิ่งนี้ใน 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 เป็นที่พึ่งพาของเสื้อเซิร์ฟเวอร์และไม่จำเป็นต้องเพิ่มจำนวนมากอย่างชัดเจน
Kalpesh Soni

ตกลงสิ่งที่เกิดขึ้นกับเราคือเราชนเจอร์ซีเซิร์ฟเวอร์จาก 1.0.2 เป็น 1.11 และคลาส "ServletContainer" ก็เป็น AWOL อย่างกะทันหัน ดูเหมือนว่ามันจะถูกย้ายไปในนั้นและเวอร์ชันในอนาคตไปยังแพ็คเกจ jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

เป็นปัญหาการตั้งค่าคราสไม่ใช่ปัญหาเจอร์ซีย์

จากเธรดนี้ ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

คลิกขวาที่คุณสมบัติโปรเจ็กต์ eclipse ของคุณ -> Deployment Assembly -> Add -> Java Build Path Entries -> Gradle Dependencies -> Finish

ดังนั้น Eclipse จึงไม่ใช้ Gradle dependencies เมื่อ Apache เริ่มทำงาน


1
ใช้เวลากับปัญหานี้มากช่วยวันของฉัน!
Tushar Thakur


2

ฉันมีปัญหาเดียวกันกับคุณแม้ว่าฉันจะทำตามคำแนะนำอื่น: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

ส่วนที่แปลกคือในคู่มือนี้ฉันใช้ฉันไม่ควรมีปัญหาใด ๆ กับความเข้ากันได้ระหว่างเวอร์ชัน (1.x เทียบกับ 2.x) เพราะทำตามคำแนะนำที่คุณใช้เสื้อ 1.8.x บนpom.xmlและในที่web.xmlคุณอ้างถึง คลาส ( com.sun.jersey.spi.container.servlet.ServletContainer) ตามที่กล่าวไว้ก่อนหน้าเวอร์ชัน 1.x อย่างที่ฉันสรุปได้ว่ามันน่าจะใช้ได้

ฉันเดาว่าเป็นเพราะฉันใช้ JDK 1.7 คลาสนี้ไม่มีอยู่แล้ว


หลังจากนั้นฉันพยายามแก้ไขด้วยคำตอบก่อนหน้าของฉันไม่ได้ช่วยฉันได้ทำการเปลี่ยนแปลงเกี่ยวpom.xmlกับweb.xmlข้อผิดพลาดและเปลี่ยนเป็น:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

ที่ควรจะมีอยู่!

จากข้อผิดพลาดนี้ฉันพบวิธีแก้ปัญหา "ใหม่": http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

ด้วย Maven (ต้นแบบ) สร้างโครงการเสื้อชอบสิ่งนี้:

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

และมันได้ผลสำหรับฉัน! :)


2

ฉันยังประสบปัญหาที่คล้ายกัน แก้ไขปัญหาโดยทำตามขั้นตอนการสอนจากลิงค์ด้านล่าง

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

  • สิ่งสำคัญที่ต้องสังเกตคือควรวางไลบรารีของเจอร์ซีย์อย่างถูกต้องในโฟลเดอร์ TOMCAT WEB-INF / lib โดยอัตโนมัติโดยการตั้งค่า Eclipse ที่กล่าวถึงในลิงค์ด้านบน มันจะสร้างไฟล์ WAR ด้วยไฟล์ JAR ที่ขึ้นอยู่กับ มิฉะนั้นคุณจะพบปัญหากับข้อยกเว้น ClassNotFound

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

"23/11/2557 00:06 น. 130,458 เสื้อ - ลูกค้า -1.9.jar

23/11/2557 00:06 น. 458,739 jersey-core-1.9.jar

23/11/2557 00:06 น. 147,952 jersey-json-1.9.jar

23/11/2557 12:06 AM 713,089 jersey-server-1.9.jar "4 ไฟล์ 1,450,238 ไบต์

  • บทช่วยสอนที่สองอธิบายเกี่ยวกับวิธีการสร้างบริการเว็บไซต์ที่สร้างและใช้เอาต์พุต JSON

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

ลิงก์ทั้งสองให้ภาพที่ดีเกี่ยวกับวิธีการทำงานและประหยัดเวลาได้มาก


1

เราได้รับข้อผิดพลาดนี้เนื่องจากปัญหาการสร้างเส้นทาง คุณควรเพิ่มไลบรารี" Server Runtime " ใน Build Path

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

โปรดปฏิบัติตามขั้นตอนด้านล่างเพื่อแก้ไขข้อยกเว้นไม่พบคลาส

คลิกขวาที่ project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

วันนี้ฉันพบข้อผิดพลาดเดียวกันแม้ว่าฉันจะใช้ Jersey 1.x และมีขวดที่ถูกต้องใน classpath ของฉัน สำหรับผู้ที่ต้องการทำตามบทช่วยสอนเกี่ยวกับจดหมายและใช้ขวด 1.x คุณจะต้องเพิ่มไลบรารีเสื้อลงในโฟลเดอร์ WEB-INF / lib วิธีนี้จะช่วยแก้ปัญหาได้อย่างแน่นอน


ฉันมีข้อผิดพลาดเดียวกัน (ใช้ jersey-server เวอร์ชัน 1.18.1, jersey-core, jersey-servlet) แต่สิ่งประดิษฐ์ที่ระเบิดซึ่ง IntelliJ Idea สร้างขึ้นเป็นโฟลเดอร์ WEB-INF เดียวที่มีโฟลเดอร์คลาสอยู่ภายในและไฟล์ web.xml โฟลเดอร์มีเฉพาะ Hello.class
skiabox

0

คุณต้องเพิ่มjersey-bundle-1.17.1.jarใน lib ของโครงการ

<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

คุณต้องแทนที่ใน web.xml ของคุณ:

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

นี่คือ Jersey 2.x ใช้แพ็คเกจ org.glassfish.jersey แทน com.sun.jersey (ซึ่งใช้โดย Jersey 1.x) และด้วยเหตุนี้จึงเป็นข้อยกเว้น โปรดทราบว่าเจอร์ซีย์ 2.x จะไม่รู้จัก init-param ที่ขึ้นต้นด้วย com.sun.jersey เมื่อคุณย้ายไปที่ JAX-RS 2.0 และ Jersey 2.x

หากคุณใช้ maven เมื่อใดก็ตาม pom.xml ของคุณจะเป็นดังนี้:

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

แทนที่ 2.X สำหรับเวอร์ชันที่คุณต้องการเช่น 2.15


0

วิธีแก้ปัญหาง่ายๆคือตรวจสอบว่าคุณมีการอ้างอิงหรือ libs ในการปรับใช้ eclipse หรือไม่อาจเป็นไปได้ว่าคุณกำลังใช้ tomcat เซิร์ฟเวอร์อาจไม่ได้ระบุ libs ที่เราใช้อยู่ ในกรณีนั้นให้ระบุไว้อย่างชัดเจนในชุดประกอบการปรับใช้


0

กลับมาที่ปัญหาเดิม - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

ตามที่กล่าวไว้ข้างต้นในเวอร์ชัน JAX 2.x คลาส ServletContainer ได้ถูกย้ายไปยังแพ็กเกจ - org.glassfish.jersey.servlet.ServletContainer โถที่เกี่ยวข้องคือjersey-container-servlet-core.jarซึ่งรวมอยู่ในjaxrs-ri-2.2.1.zip

JAX RS สามารถทำงานได้โดยไม่ต้อง mvn โดยการคัดลอกไหทั้งหมดที่มีอยู่ในไฟล์ zip jaxrs-ri-2.2.1.zipด้วยตนเอง(ฉันใช้เวอร์ชันนี้จะทำงานกับเวอร์ชัน 2.x ใดก็ได้) ไปยังโฟลเดอร์ WEB-INF / lib การคัดลอก libs ไปยังโฟลเดอร์ด้านขวาทำให้พร้อมใช้งานที่รันไทม์

สิ่งนี้จำเป็นหากคุณกำลังใช้ eclipse เพื่อสร้างและปรับใช้โครงการของคุณ



0

เกิดข้อผิดพลาดเดียวกันและเสียเวลา 2+ ชั่วโมงในการแก้ไขข้อบกพร่องและลองใช้ตัวเลือกทั้งหมด ฉันไม่ได้ใช้ Maven / POM ดังนั้นฉันจึงไม่สามารถใช้ประโยชน์จากโซลูชันนั้นได้

ในที่สุดสิ่งต่อไปนี้ก็แก้ไขได้: การเพิ่ม jars โดยตรงไปยังโฟลเดอร์ tomcat / lib (NOT WEB-INF \ lib) และรีสตาร์ท tomcat


0

หากใครกำลังพยายามสร้างแอปพลิเคชัน hello world โดยใช้ Jersey ฉันคิดว่าหนึ่งในวิธีที่ง่ายที่สุดคือทำตามเอกสารของ Jersey

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

หากคุณใช้ maven อยู่แล้วจะใช้เวลาเพียงไม่กี่นาทีเพื่อดูผลลัพธ์

ฉันใช้ด้านล่าง

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

0

โดยพื้นฐานแล้วขึ้นอยู่กับว่าคุณใช้เสื้อรุ่นใด หากคุณใช้ Jersey ver.1.XX คุณต้องเพิ่ม

นิวเจอร์ซีย์ 1 ใช้ " com.sun.jersey " และนิวเจอร์ซีย์ 2 ใช้org.glassfish บนแท็กคลาส servlet นอกจากนี้โปรดทราบว่าเจอร์ซี 2 จะไม่รู้จัก init-param ที่ขึ้นต้นด้วย com.sun.jersey

และเพิ่มไฟล์ jar ทั้งหมดลงในโฟลเดอร์ lib WEB-INF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.