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


86

Jersey + Google uygulama motorunu kullanarak iki gün boyunca basit bir merhaba dünya uygulaması oluşturmaya çalışıyorum. Basit AppEngine projesi için bu eğiticileri izledim ve her ikisi de iyi çalışıyor https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Ama şimdi Jersey'i eklemeye ve bu öğreticiyi takip etmeye çalışıyorum http://www.vogella.com/articles/REST/article.html .

Ama sunucu bana vermeye devam ediyor

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

bu satırları web.xml dosyasına eklediğimde :

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

Ben Jersey indirdiğiniz JAX-RS 2.1 RI bundledan burada ve tüm kavanoz dosyaları ekledik WEB-INF/liböğretici açıklandığı gibi klasörde. Ve iki gün sonra bile hiçbir şey işe yaramıyor. Google'da birkaç kez aradım ve görünüşe göre Maven'i kullanan kişiler bir şekilde sorunu çözdü, ancak Maven'ı kullanmıyorum ne de bu öğreticiyi yazan adam.

Sadece ithalde bile com.sun.jersey.spi.container.servlet.ServletContainervar olup olmadığını kontrol etmek Jersey jarsiçin sadece bu tam nitelikli ismi Java'da yazmaya çalıştım ve intellisense isimleri bitirmeye çalıştım ama sonra herhangi bir intellisense alamadım com.sun.je, bu yüzden son tahminim en son Jersey yapısında bazı paket yeniden düzenlemeleri olduğu . ve jerseyartık içeride değil com.sun. Yoruldum ve her türlü yardım için minnettarım.


Jersey'i nasıl yerleştirdiniz? 2.29 sürümünün altındaki hiçbir şeye erişemiyorum ve makale 2.11 hakkında konuşuyor?
piksel

Yanıtlar:


156

Jersey 2'yi indirdiniz (JAX-RS 2'nin RI'si). Bahsettiğiniz eğitim Jersey 1'i kullanıyor. Jersey 1.17.1'i ( buradan ) indirin, sizin için yeterli olacaktır.

Jersey 1 kullanır com.sun.jerseyve Jersey 2 org.glassfish.jerseybu nedenle istisnayı kullanır .

Ayrıca, init-paramile başlamanın com.sun.jerseyJersey 2 tarafından tanınmayacağını da unutmayın .

Düzenle

Jersey 2'de Kaynakların ve Sağlayıcıların Kaydedilmesi, Jersey 2'de sınıfların / örneklerin nasıl kaydedileceği hakkında ek bilgiler içerir.


2
+1. Benzer sorunları olan diğer kişiler için bir ek olarak, resmi Jersey Kullanıcı Kılavuzu: 4. Bölüm'ü
informatik01

6
servlet-container için yeni sınıf "org.glassfish.jersey.servlet.ServletContainer"
cljk

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

1
Bu cevap, sorunun / hatanın nedenini iyi açıklar, ancak çözümü çok açık bırakır. Çünkü verdiğiniz küçük bilgilerle sorunumu çözemedim. Pom.xml, web.xml ve java dosyalarıyla ilgili daha fazla ayrıntı daha iyi bir iş çıkarabilir. Veya okuyucuyu Jersey 2.x
Paulo Oliveira

1
@Siddharth bağlantılı makalenin, sorunun nasıl çözüleceğini bazı yaklaşımlar göstermesi gerekiyordu. Bu makalede eksik bir bilgi bulursanız bana bildirin. Ya da her zaman çözümünüzü bu soruya bir cevap olarak sunabilirsiniz.
Michal Gajdos

34

Jersey 2.x kullanıyorsanız, servlet sınıfı değiştiği için web.xml'de farklı bir konfigürasyona ihtiyacınız vardır. web.xml dosyanızı aşağıdaki yapılandırmayla güncelleyebilirsiniz.

    <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
Gerçekten birime ihtiyacınız var mı : WidgetPU ? Sanırım yanıt kaldırılarak basitleştirilebilir.
Nikita Bosik

1
Bu parametre Jersey <init-param> <param-name> unit: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param> ile ilgili değil
vaquar khan

22

Bunu pom'a ekle

<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, jersey sunucusunun bir bağımlılığıdır ve çoğunun açık bir şekilde eklenmesine gerek yoktur
Kalpesh Soni

Tamam bize olan şey şu: Jersey sunucusunu 1.0.2'den 1.11'e düşürdük ve "ServletContainer" sınıfı birden bire AWOL oldu. Görünüşe göre bu ve sonraki sürümlerde jersey-servlet paketine taşındı ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

Bu bir tutulma kurulum sorunu, Jersey sorunu değil.

Bu iş parçacığından ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Eclipse projenize sağ tıklayın Özellikler -> Dağıtım Montajı -> Ekle -> Java Derleme Yolu Girişleri -> Gradle Bağımlılıkları -> Bitir.

Yani Eclipse, Apache başlarken Gradle bağımlılıklarını kullanmıyordu.


1
Bu konu için çok zaman harcadım, günümü kurtardım!
Tushar Thakur

3

bunu dene :

org.glassfish.jersey.servlet.ServletContainer

servlet sınıfında


2

Farklı bir kılavuzu izlememe rağmen sizinle aynı sorunu yaşadım: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Garip bir parçasıdır üzerinde forması 1.8.x kullanmak kılavuz aşağıdaki çünkü sürümleri arasındaki uyumluluk (2.x karşı 1.x) ile herhangi bir sorun olmamalıdır, bu kılavuzda ben kullandım, yani pom.xmlve web.xmlsen başvurmak com.sun.jersey.spi.container.servlet.ServletContainer1.x sürümünden önce söylendiği gibi bir sınıf ( ). Yani bunun işe yaraması gerektiği sonucuna varabilirim.

Tahminim , JDK 1.7 kullanıyorum çünkü bu sınıf artık mevcut değil.


Daha sonra, cevapları kendimden önce çözmeye çalıştım, yardımcı olmadım , hata pom.xmlüzerinde değişiklik yaptım ve şu web.xmlşekilde değiştirdim:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Hangi sözde var olmalı!

Bu hatanın sonucunda "yeni" bir çözüm buldum: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Maven (arketipler) ile bir jarse projesi oluşturun, bunu seviyor:

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

Ve benim için çalıştı! :)


2

Ben de benzer bir sorunla karşılaştım. Aşağıdaki bağlantıdan adım adım öğreticiden geçerek sorunu çözdük.

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

  • Dikkat edilmesi gereken en önemli şey, jersey kitaplıklarının TOMCAT WEB-INF / lib klasörüne doğru şekilde yerleştirilmesi gerektiğidir. Yukarıdaki linkte belirtilen Eclipse ayarları ile otomatik olarak yapılır. Bağımlı JAR Dosyaları ile bir WAR dosyası oluşturacaktır. Aksi takdirde, ClassNotFound Exception ile ilgili sorunlarla karşılaşacaksınız.

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

"23.11.2014 12:06 130.458 jersey-client-1.9.jar

23.11.2014 12:06 458.739 jersey-core-1.9.jar

23.11.2014 12:06 147.952 jersey-json-1.9.jar

23.11.2014 12:06 AM 713.089 jersey-server-1.9.jar "4 Dosya 1.450.238 bayt

  • İkinci eğitim, JSON çıktısı üreten ve tüketen bir Web hizmetinin nasıl oluşturulacağını açıklar.

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

Her iki bağlantı da işlerin nasıl yürüdüğüne ve çok zaman kazandırdığına dair iyi bir resim verdi.


1

Bu hatayı derleme yolu sorunu nedeniyle alıyoruz. Derleme Yoluna " Sunucu Çalışma Zamanı " kitaplıkları eklemelisiniz .

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

Sınıf istisnası bulunamadı sorununu çözmek için lütfen aşağıdaki adımları izleyin.

Sağ tıklayın project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

Bugün Jersey 1.x'i kullanmama ve sınıf yolumda doğru kavanozlara sahip olmama rağmen aynı hatayla karşılaştım. Vogella eğitimini harfiyen takip etmek ve 1.x kavanozlarını kullanmak isteyenler için, jersey kitaplıklarını WEB-INF / lib klasörüne eklemeniz gerekir. Bu kesinlikle sorunu çözecektir.


Aynı hatayı alıyorum (jersey-server, jersey-core, jersey-servlet'in 1.18.1 sürümünü kullanarak) ancak IntelliJ Idea'nın oluşturduğu patlatılmış yapı, içinde sınıflar klasörü ve web.xml dosyası bulunan tek bir WEB-INF klasörü. klasör sadece Merhaba.class
skiabox

0

jersey-bundle-1.17.1.jarlib of project'e eklemeniz gerekiyor

<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'nizde değiştirmeniz gerekir:

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

bunun için:

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

burası Jersey 2.x, com.sun.jersey (Jersey 1.x tarafından kullanılır) yerine org.glassfish.jersey paketlerini kullanır ve bu nedenle istisnadır. Com.sun.jersey ile başlayan init-param'ın JAX-RS 2.0 ve Jersey 2.x'e geçtiğinizde Jersey 2.x tarafından tanınmayacağını unutmayın.

Herhangi bir anda maven kullanırsanız, pom.xml dosyanız şöyle olur:

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

İstediğiniz sürüm için 2.X'i değiştirin, örneğin 2.15


0

Basit bir çözüm, eclipse dağıtım derlemesinde bağımlılıklarınız veya kitaplıklarınız olup olmadığını kontrol etmektir. Muhtemelen tomcat kullanıyorsanız, sunucu kullandığımız kitaplıkları tanımlamamış olabilir. bu durumda bunu dağıtım derlemesinde açıkça belirtin.


0

Orijinal soruna geri dönüyoruz - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Yukarıda da belirtildiği gibi, JAX 2.x sürümünde ServletContainer sınıfı, - org.glassfish.jersey.servlet.ServletContainer paketine taşınmıştır. İlgili kavanoz, jaxrs-ri-2.2.1.zip içinde paketlenmiş olan jersey-container-servlet- core.jar'dır.

JAX RS elle bütün kavanoz zip dosyası içinde bulunan kopyalayarak MVN'nin olmadan çalışmış olabilir jaxrs-ri-2.2.1.zip WEB-INF / lib klasörüne (i herhangi 2.x sürümü ile çalışacak, bu sürümü kullandık). Kitaplıkları doğru klasöre kopyalamak, onları çalışma zamanında kullanılabilir hale getirir.

Bu, projenizi oluşturmak ve dağıtmak için eclipse kullanıyorsanız gereklidir.


0

Pom.xml dosyasında eklememiz gereken

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

0

Aynı hata ve hata ayıklama ve tüm seçenekleri denemek için 2+ saat boşa gitti. Maven / POM'u kullanmıyordum, bu yüzden birkaç kişinin verdiği çözümden yararlanamadım.

Sonunda aşağıdakiler sorunu çözdü: Kavanozları doğrudan tomcat / lib (WEB-INF \ lib DEĞİL) klasörüne eklemek ve tomcat'i yeniden başlatmak.


0

Jersey kullanarak bir merhaba dünya uygulaması oluşturmaya çalışan biri varsa, en kolay yollardan birinin Jersey belgelerini takip etmek olduğunu düşünüyorum.

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

Zaten maven kullanıyorsanız, sonucu görmek yalnızca birkaç dakika sürer.

Aşağıda kullandım.

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

0

Temel olarak hangi formayı kullandığınıza bağlıdır. Jersey sürüm 1.XX kullanıyorsanız eklemeniz gerekir

Jersey 1 " com.sun.jersey " kullanır ve Jersey 2 org.glassfish kullanır . servlet sınıf etiketinde. Ayrıca, com.sun.jersey ile başlayan init-param'ın Jersey 2 tarafından tanınmayacağını da unutmayın.

Ve tüm jar dosyasını WEB-INF lib klasörüne ekleyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.