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

86

Saya mencoba membuat aplikasi hello world sederhana selama dua hari menggunakan mesin aplikasi Jersey + Google. Untuk proyek AppEngine sederhana, saya mengikuti tutorial ini dan keduanya berfungsi dengan baik https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Tapi sekarang saya mencoba menambahkan Jersey dan mengikuti tutorial ini http://www.vogella.com/articles/REST/article.html .

Tapi server terus memberi saya

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

ketika saya menambahkan baris ini di 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>

Saya telah mengunduh Jersey JAX-RS 2.1 RI bundledari sini dan telah menambahkan semua file jar di WEB-INF/libfolder seperti yang dijelaskan dalam tutorial. Dan bahkan setelah dua hari tidak ada yang berhasil. Saya telah mencari beberapa kali di Google dan tampaknya orang-orang yang menggunakan Maven telah memecahkannya entah bagaimana tetapi saya tidak menggunakan Maven juga orang yang menulis tutorial itu.

Hanya untuk memeriksa apakah bahkan com.sun.jersey.spi.container.servlet.ServletContainerada di impor Jersey jarssaya mencoba untuk hanya menulis nama yang memenuhi syarat ini di Jawa dan membiarkan nama selesai intellisense tetapi saya tidak bisa mendapatkan kecerdasan apa pun setelah com.sun.jejadi tebakan terakhir saya adalah bahwa ada beberapa pengaturan ulang paket dalam pembuatan Jersey terbaru dan jerseytidak lagi di dalam com.sun. Saya kelelahan dan saya sangat menghargai bantuan apa pun.

M-WaJeEh
sumber
Bagaimana Anda menginstal Jersey? Saya tidak dapat mengakses apa pun di bawah versi 2.29 dan artikel membahas tentang 2.11?
piksel

Jawaban:

156

Anda telah mendownload Jersey 2 (yang RI dari JAX-RS 2). Tutorial yang Anda maksud menggunakan Jersey 1. Unduh Jersey 1.17.1 dari (di sini ), sudah cukup untuk Anda.

Jersey 1 menggunakan com.sun.jersey, dan Jersey 2 menggunakan org.glassfish.jerseypengecualian.

Perhatikan juga bahwa init-parammemulai dengan com.sun.jerseytidak akan dikenali oleh Jersey 2.

Sunting

Mendaftarkan Sumber Daya dan Penyedia di Jersey 2 berisi info tambahan tentang cara mendaftarkan kelas / instance di Jersey 2.

Michal Gajdos
sumber
2
+1. Sebagai tambahan bagi orang lain dengan masalah serupa, akan bermanfaat untuk membaca Panduan Pengguna Jersey resmi: Bab 4. Menyebarkan Layanan Web yang RESTful
informatik01
6
kelas baru untuk servlet-container adalah "org.glassfish.jersey.servlet.ServletContainer"
cljk
4
kelas-servlet: org.glassfish.jersey.servlet.ServletContainer, nama-param-init: jersey.config.server.provider.packages.
piknik 涅
1
Jawaban ini menjelaskan dengan baik alasan dari masalah / kesalahan tersebut, tetapi membiarkan solusinya sangat terbuka. Karena, dengan sedikit informasi yang Anda berikan saya tidak bisa menyelesaikan masalah saya. Beberapa detail lebih lanjut tentang file pom.xml, web.xml, dan java dapat berfungsi lebih baik. Atau rujuk blog atau artikel yang memandu pembaca ke dalam tutorial untuk Jersey 2.x
Paulo Oliveira
1
@Siddharth artikel terkait seharusnya menunjukkan beberapa pendekatan bagaimana memecahkan masalah itu. Jika Anda menemukan beberapa informasi yang hilang dalam artikel itu, beri tahu saya. Atau Anda selalu dapat memberikan solusi Anda sebagai jawaban atas pertanyaan ini.
Michal Gajdos
34

Jika Anda menggunakan jersey 2.x maka Anda memerlukan konfigurasi yang berbeda di web.xml karena kelas servlet berubah di dalamnya. Anda dapat memperbarui web.xml Anda dengan konfigurasi berikut.

    <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>
hal 27
sumber
9
Apakah Anda benar-benar membutuhkan unit: WidgetPU ? Saya pikir jawabannya bisa disederhanakan dengan menghapusnya.
Nikita Bosik
1
Parameter ini tidak terkait dengan unit Jersey <init-param> <param-name>: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan
22

Tambahkan ini di 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>
pengguna1249655
sumber
2
jersey-core adalah ketergantungan jersey-server dan banyak yang tidak perlu ditambahkan secara eksplisit
Kalpesh Soni
OK apa yang terjadi pada kami adalah kami menabrak jersey-server dari 1.0.2 ke 1.11 dan kelas "ServletContainer" tiba-tiba AWOL. Sepertinya sudah dipindahkan dalam versi itu dan versi mendatang ke paket jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack
15

Ini masalah pengaturan gerhana, bukan masalah Jersey.

Dari utas ini ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Klik kanan Properties proyek eclipse Anda -> Deployment Assembly -> Add -> Java Build Path Entries -> Gradle Dependencies -> Finish.

Jadi Eclipse tidak menggunakan dependensi Gradle saat Apache dimulai.

Adi
sumber
1
Menghabiskan begitu banyak waktu untuk masalah ini, menyelamatkan hari saya!
Tushar Thakur
3

coba ini :

org.glassfish.jersey.servlet.ServletContainer

di kelas servlet

Pichitron
sumber
2

Saya memiliki masalah yang sama seperti Anda meskipun saya telah mengikuti panduan yang berbeda: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Bagian yang aneh adalah, dalam panduan ini yang telah saya gunakan, saya seharusnya tidak memiliki masalah dengan kompatibilitas antara versi (1.x melawan 2.x) karena mengikuti panduan Anda menggunakan jersey 1.8.x pom.xmldan di web.xmlAnda mengacu pada kelas ( com.sun.jersey.spi.container.servlet.ServletContainer) seperti yang dikatakan sebelumnya dari versi 1.x. Jadi seperti yang bisa saya simpulkan ini seharusnya berhasil.

Dugaan saya karena saya menggunakan JDK 1.7 kelas ini sudah tidak ada lagi.


Setelah, saya mencoba menyelesaikan dengan jawaban sebelum saya, tidak membantu, saya telah membuat perubahan pada pom.xmldan pada web.xmlkesalahan berubah menjadi:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Yang seharusnya ada!

Akibat kesalahan ini, saya menemukan solusi "baru": http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Dengan Maven (arketipe), buat proyek jersey, seperti ini:

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

Dan itu berhasil untuk saya! :)

Paulo Oliveira
sumber
2

Saya juga menghadapi masalah serupa. Selesaikan masalah dengan melalui tutorial langkah langkah dari tautan di bawah ini.

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

  • Hal utama yang perlu diperhatikan adalah bahwa perpustakaan jersey harus ditempatkan dengan benar di folder TOMCAT WEB-INF / lib. Ini dilakukan secara otomatis oleh pengaturan Eclipse yang disebutkan di tautan di atas. Ini akan membuat file WAR dengan File JAR tergantung. Jika tidak, Anda akan mengalami masalah dengan Pengecualian ClassNotFound.

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

11/23/2014 12:06 AM 713.089 jersey-server-1.9.jar "4 File 1.450.238 byte

  • Tutorial kedua menjelaskan tentang cara membuat Webservice yang menghasilkan dan menggunakan output JSON.

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

Kedua tautan tersebut memberikan gambaran yang baik tentang cara kerja dan menghemat banyak waktu.

yogishaj
sumber
1

Kami mendapatkan kesalahan ini karena masalah jalur build. Anda harus menambahkan pustaka " Server Runtime " di Build Path.

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

Ikuti langkah-langkah di bawah ini untuk menyelesaikan kelas tidak ditemukan pengecualian.

Klik kanan project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Sachin GN
sumber
0

Saya mengalami kesalahan yang sama hari ini meskipun saya menggunakan Jersey 1.x, dan memiliki stoples yang tepat di jalur kelas saya. Bagi mereka yang ingin mengikuti tutorial vogella ke surat itu, dan menggunakan toples 1.x, Anda perlu menambahkan perpustakaan jersey ke folder WEB-INF / lib. Ini pasti akan menyelesaikan masalah.

rickygrimes
sumber
Saya memiliki kesalahan yang sama (menggunakan versi 1.18.1 dari jersey-server, jersey-core, jersey-servlet) tetapi artefak yang meledak yang dibuat oleh IntelliJ Idea adalah satu folder WEB-INF dengan folder kelas di dalamnya dan file web.xml. folder hanya berisi Hello.class
skiabox
0

Anda perlu menambahkan jersey-bundle-1.17.1.jarke lib proyek

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

Ahmad R. Nazemi
sumber
0

Anda harus mengganti di web.xml Anda:

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

untuk ini:

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

ini adalah Jersey 2.x menggunakan paket org.glassfish.jersey bukan com.sun.jersey (yang digunakan oleh Jersey 1.x) dan karenanya merupakan pengecualian. Perhatikan bahwa init-param yang dimulai dengan com.sun.jersey tidak akan dikenali oleh Jersey 2.x setelah Anda bermigrasi ke JAX-RS 2.0 dan Jersey 2.x

jika suatu saat Anda menggunakan maven, pom.xml Anda akan menjadi ini:

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

ganti 2.X untuk versi keinginan Anda, misalnya 2.15

Juan David Grisales Garzon
sumber
0

Solusi sederhana adalah, periksa apakah Anda memiliki dependensi atau libs dalam perakitan penerapan eclipse. Mungkin jika Anda menggunakan tomcat, server mungkin tidak mengidentifikasi lib yang kami gunakan. dalam hal ini tentukan secara eksplisit dalam perakitan penyebaran.

bersinar
sumber
0

Kembali ke masalah aslinya - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Seperti yang dikatakan dengan benar di atas, dalam versi JAX 2.x, kelas ServletContainer telah dipindahkan ke paket - org.glassfish.jersey.servlet.ServletContainer. Guci terkait adalah jersey-container-servlet-core.jar yang dibundel dalam jaxrs-ri-2.2.1.zip

JAX RS dapat bekerja tanpa mvn dengan menyalin secara manual semua toples yang terdapat dalam file zip jaxrs-ri-2.2.1.zip (saya telah menggunakan versi ini, akan bekerja dengan versi 2.x apa pun) ke folder WEB-INF / lib. Menyalin libs ke folder kanan membuatnya tersedia saat runtime.

Ini diperlukan jika Anda menggunakan eclipse untuk membangun dan menerapkan proyek Anda.

Andy 1625
sumber
0

Di file pom.xml kita perlu menambahkan

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
KARTHIKEYAN.A
sumber
0

Kesalahan yang sama dan menghabiskan 2+ jam debugging dan mencoba semua opsi. Saya tidak menggunakan Maven / POM, jadi saya tidak dapat memanfaatkan solusi yang diberikan oleh sedikit orang.

Akhirnya hal berikut menyelesaikannya: Menambahkan toples langsung ke folder tomcat / lib (BUKAN WEB-INF \ lib) dan memulai ulang tomcat.

Velu
sumber
0

Jika ada yang mencoba membuat aplikasi hello world menggunakan Jersey, menurut saya salah satu cara termudah adalah mengikuti dokumentasi Jersey.

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

Jika Anda sudah menggunakan maven, hanya perlu beberapa menit untuk melihat hasilnya.

Saya gunakan di bawah ini.

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

Ini pada dasarnya tergantung pada jersey versi mana yang Anda gunakan. Jika Anda menggunakan Jersey ver.1.XX Anda perlu menambahkan

Jersey 1 menggunakan " com.sun.jersey ", dan Jersey 2 menggunakan org.glassfish . pada tag kelas servlet. Selain itu, perhatikan bahwa init-param yang dimulai dengan com.sun.jersey tidak akan dikenali oleh Jersey 2.

Dan Tambahkan semua file jar ke folder lib WEB-INF

Arun
sumber