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


85

Sto cercando di creare una semplice applicazione Hello World per due giorni utilizzando Jersey + Google app engine. Per un semplice progetto AppEngine ho seguito questi tutorial ed entrambi funzionano perfettamente https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Ma ora sto cercando di aggiungere Jersey e seguendo questo tutorial http://www.vogella.com/articles/REST/article.html .

Ma il server continua a darmi

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

quando aggiungo queste righe in 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>

Ho scaricato Jersey JAX-RS 2.1 RI bundleda qui e ho aggiunto tutti i file jar nella WEB-INF/libcartella come descritto nel tutorial. E anche dopo due giorni non funziona niente. Ho cercato più volte su Google e apparentemente le persone che usano Maven l'hanno risolto in qualche modo, ma non sto usando Maven né ha fatto il ragazzo che ha scritto quel tutorial.

Solo per verificare se com.sun.jersey.spi.container.servlet.ServletContaineresiste anche in importato, Jersey jarsho provato a scrivere questo nome completo in Java e lasciare che l'intellisense finisca i nomi ma non sono riuscito a ottenere alcun intellisense dopo com.sun.jequindi la mia ultima ipotesi è che ci siano stati alcuni riarrangiamenti dei pacchetti nell'ultima build del Jersey e jerseynon è più dentro com.sun. Sono esausto e apprezzerei qualsiasi tipo di aiuto.


Come hai installato la maglia? Non riesco ad accedere a nulla al di sotto della versione 2.29 e l'articolo parla di 2.11?
pixel

Risposte:


154

Hai scaricato Jersey 2 (quale RI di JAX-RS 2). Il tutorial a cui ti riferisci utilizza Jersey 1. Scarica Jersey 1.17.1 da ( qui ), dovrebbe essere sufficiente per te.

Jersey 1 utilizza com.sun.jerseye Jersey 2 utilizza org.glassfish.jerseyquindi l'eccezione.

Si noti inoltre che anche l' init-paraminizio con com.sun.jerseynon verrà riconosciuto da Jersey 2.

modificare

La registrazione di risorse e fornitori in Jersey 2 contiene informazioni aggiuntive su come registrare classi / istanze in Jersey 2.


2
+1. Come aggiunta per altri con problemi simili, sarà utile leggere la Guida ufficiale dell'utente Jersey: Capitolo 4. Distribuzione di un servizio Web RESTful
informatik01

6
la nuova classe per servlet-container è "org.glassfish.jersey.servlet.ServletContainer"
cljk

4
classe-servlet: org.glassfish.jersey.servlet.ServletContainer, nome-parametro-init: jersey.config.server.provider.packages.
picmate 涅

1
Questa risposta spiega bene il motivo del problema / errore, ma lascia la soluzione molto aperta. Perché con le poche informazioni che hai fornito non sono riuscito a risolvere il mio problema. Alcuni dettagli in più sui file pom.xml, web.xml e java potrebbero fare un lavoro migliore. Oppure fai riferimento a un blog o articolo che guida il lettore in un tutorial per Jersey 2.x
Paulo Oliveira

1
@ Siddharth l'articolo collegato avrebbe dovuto mostrare alcuni approcci su come risolvere il problema. Se trovi alcune informazioni mancanti in quell'articolo, fammelo sapere. Oppure puoi sempre fornire la tua soluzione come risposta a questa domanda.
Michal Gajdos

34

Se si utilizza jersey 2.x, è necessaria una configurazione diversa in web.xml poiché la classe servlet viene modificata in esso. puoi aggiornare il tuo web.xml con la seguente configurazione.

    <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
Hai effettivamente bisogno di unità: WidgetPU ? Penso che la risposta potrebbe essere semplificata rimuovendola.
Nikita Bosik

1
Questo parametro non è correlato a Jersey <init-param> <param-name> unità: WidgetPU </param-name> <param-value> persistenza / widget </param-value> </init-param>
vaquar khan

22

Aggiungi questo in 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 è una dipendenza di jersey-server e molti non sono necessari per aggiungere esplicitamente
Kalpesh Soni

OK, quello che ci è successo è che abbiamo spostato jersey-server da 1.0.2 a 1.11 e la classe "ServletContainer" è improvvisamente AWOL. Sembra che sia stato spostato in quella e nelle versioni future nel pacchetto jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

È un problema di installazione di eclissi, non un problema di Jersey.

Da questo thread ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Fare clic con il pulsante destro del mouse su Proprietà del progetto eclipse -> Assembly di distribuzione -> Aggiungi -> Voci del percorso di build Java -> Dipendenze Gradle -> Fine.

Quindi Eclipse non utilizzava le dipendenze Gradle all'avvio di Apache.


1
Ho trascorso così tanto tempo per questo problema, mi ha salvato la giornata!
Tushar Thakur

3

prova questo :

org.glassfish.jersey.servlet.ServletContainer

sulla classe servlet


2

Ho avuto lo stesso problema come te anche se ho seguito una guida diversa: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

La parte strana è che, in questa guida che ho utilizzato, non dovrei avere nessun problema di compatibilità tra le versioni (1.x contro 2.x) perché seguendo la guida si usa la maglia 1.8.x su pom.xmle nella a cui web.xmlsi fa riferimento una class ( com.sun.jersey.spi.container.servlet.ServletContainer) come detto prima della versione 1.x. Quindi, come posso dedurre, dovrebbe funzionare.

La mia ipotesi è che sto usando JDK 1.7 questa classe non esiste più.


Dopo, ho provato a risolvere con le risposte prima della mia, non mi ha aiutato, ho apportato modifiche all'errore pom.xmle web.xmlall'errore modificato in:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Che presumibilmente dovrebbe esistere!

Come risultato di questo errore, ho trovato una "nuova" soluzione: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Con Maven (archetipi), genera un progetto jersey, piace questo:

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

E ha funzionato per me! :)


2

Ho anche affrontato un problema simile. Ha risolto il problema seguendo il tutorial passo passo dal link sottostante.

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

  • La cosa principale da notare è che le librerie jersey dovrebbero essere posizionate correttamente nella cartella TOMCAT WEB-INF / lib. Viene eseguito automaticamente dalle impostazioni di Eclipse menzionate nel collegamento sopra. Creerà un file WAR con i file JAR dipendenti. Altrimenti, ti imbatterai in problemi con l'eccezione ClassNotFound.

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

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

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

23/11/2014 00:06 147.952 jersey-json-1.9.jar

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

  • Il secondo tutorial spiega come creare un Webservice che produce e consuma output JSON.

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

Entrambi i collegamenti hanno fornito una buona immagine di come funzionano le cose e fanno risparmiare molto tempo.


1

Otteniamo questo errore a causa di un problema con il percorso di compilazione. È necessario aggiungere le librerie " Server Runtime " in Build Path.

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

Si prega di seguire i passaggi seguenti per risolvere l'eccezione di classe non trovata.

Fare clic con il tasto destro su project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

Oggi ho riscontrato lo stesso errore anche se stavo usando Jersey 1.x e avevo i vasi giusti nel mio classpath. Per coloro che desiderano seguire il tutorial di vogella alla lettera e utilizzare i barattoli 1.x, è necessario aggiungere le librerie jersey alla cartella WEB-INF / lib. Questo risolverà sicuramente il problema.


Ho lo stesso errore (utilizzando la versione 1.18.1 di jersey-server, jersey-core, jersey-servlet) ma l'artefatto esploso che IntelliJ Idea crea è una singola cartella WEB-INF con la cartella delle classi all'interno e il file web.xml. la cartella contiene solo Hello.class
skiabox

0

devi aggiungere jersey-bundle-1.17.1.jaralla libreria del progetto

<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

Devi sostituire nel tuo 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>

per questo:

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

questo è Jersey 2.x usa i pacchetti org.glassfish.jersey invece di com.sun.jersey (che è usato da Jersey 1.x) e quindi l'eccezione. Tieni presente che anche il parametro init che inizia con com.sun.jersey non verrà riconosciuto da Jersey 2.x una volta eseguita la migrazione a JAX-RS 2.0 e Jersey 2.x

se in qualsiasi momento usi Maven, il tuo pom.xml sarebbe questo:

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

sostituire 2.X per la versione desiderata, ad esempio 2.15


0

Una semplice soluzione alternativa è controllare se si hanno dipendenze o librerie nell'assembly di distribuzione di eclipse. Probabilmente se si utilizza Tomcat, il server potrebbe non aver identificato le librerie che stiamo utilizzando. in tal caso specificarlo esplicitamente nell'assembly di distribuzione.


0

Tornando al problema originale: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Come giustamente detto sopra, nella versione JAX 2.x, la classe ServletContainer è stata spostata nel pacchetto - org.glassfish.jersey.servlet.ServletContainer. Il jar correlato è jersey-container-servlet-core.jar che viene fornito in bundle all'interno di jaxrs-ri-2.2.1.zip

JAX RS può essere risolto senza mvn copiando manualmente tutti i jar contenuti nel file zip jaxrs-ri-2.2.1.zip (ho usato questa versione, funzionerebbe con qualsiasi versione 2.x) nella cartella WEB-INF / lib. La copia delle librerie nella cartella giusta le rende disponibili in fase di esecuzione.

Questo è necessario se stai usando eclipse per creare e distribuire il tuo progetto.


0

Nel file pom.xml dobbiamo aggiungere

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

0

Lo stesso errore e sprecato più di 2 ore di debug e di provare tutte le opzioni. Non stavo usando il Maven / POM, quindi non ho potuto sfruttare quella soluzione fornita da pochi.

Alla fine è stato risolto quanto segue: aggiungendo i jar direttamente alla cartella tomcat / lib (NON WEB-INF \ lib) e riavviando il tomcat.


0

Se qualcuno sta cercando di creare un'applicazione hello world usando Jersey, penso che uno dei modi più semplici sia seguire la documentazione di Jersey.

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

Se stai già usando Maven, ci vorranno solo pochi minuti per vedere il risultato.

Ho usato di seguito.

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

0

Fondamentalmente dipende dalla versione della maglia che stai usando. Se stai usando Jersey ver.1.XX devi aggiungere

Jersey 1 utilizza " com.sun.jersey " e Jersey 2 utilizza org.glassfish . sul tag della classe servlet. Inoltre, tieni presente che anche il parametro init che inizia con com.sun.jersey non verrà riconosciuto da Jersey 2.

E aggiungi tutto il file jar nella cartella lib WEB-INF

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.