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

85

J'essaie de créer une simple application Hello World pendant deux jours à l'aide du moteur d'application Jersey + Google. Pour un projet AppEngine simple, j'ai suivi ces didacticiels et les deux fonctionnent très bien https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Mais maintenant, j'essaye d'ajouter Jersey et de suivre ce tutoriel http://www.vogella.com/articles/REST/article.html .

Mais le serveur continue de me donner

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

quand j'ajoute ces lignes dans 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>

J'ai téléchargé Jersey à JAX-RS 2.1 RI bundlepartir d' ici et j'ai ajouté tous les fichiers jar dans le WEB-INF/libdossier comme décrit dans le didacticiel. Et même après deux jours, rien ne fonctionne. J'ai cherché plusieurs fois sur Google et apparemment les gens qui utilisent Maven l'ont résolu d'une manière ou d'une autre, mais je n'utilise pas Maven non plus que le type qui a écrit ce tutoriel.

Juste pour vérifier s'il com.sun.jersey.spi.container.servlet.ServletContainerexiste même dans importé, Jersey jarsj'ai essayé d'écrire ce nom complet en Java et de laisser l'intellisense terminer les noms, mais je n'ai pas pu obtenir d'intellisense après, com.sun.jedonc ma dernière hypothèse est qu'il y a eu un réarrangement de paquet dans la dernière version de Jersey et jerseyn'est plus à l'intérieur com.sun. Je suis épuisé et j'apprécierais toute sorte d'aide.

M-WaJeEh
la source
Comment avez-vous installé le Jersey? Je ne parviens pas à accéder à quoi que ce soit sous la version 2.29 et l'article parle de 2.11?
pixel

Réponses:

154

Vous avez téléchargé Jersey 2 (quel RI de JAX-RS 2). Le tutoriel auquel vous faites référence utilise Jersey 1. Téléchargez Jersey 1.17.1 à partir de ( ici ), devrait vous suffire.

Jersey 1 utilise com.sun.jersey, et Jersey 2 utilise org.glassfish.jerseydonc l'exception.

Notez également que init-paramcommencer par com.sun.jerseyne sera pas reconnu par Jersey 2.

Éditer

Enregistrer des ressources et des fournisseurs dans Jersey 2 contient des informations supplémentaires sur la façon d'enregistrer des classes / instances dans Jersey 2.

Michal Gajdos
la source
2
+1. En complément pour d'autres personnes ayant des problèmes similaires, il sera utile de lire le Guide de l'utilisateur officiel de Jersey: Chapitre 4. Déploiement d'un service Web RESTful
informatik01
6
la nouvelle classe pour le conteneur de servlet est "org.glassfish.jersey.servlet.ServletContainer"
cljk
4
classe-servlet: org.glassfish.jersey.servlet.ServletContainer, nom-param-init: jersey.config.server.provider.packages.
picmate 涅
1
Cette réponse explique bien la raison du problème / de l'erreur, mais laisse la solution très ouverte. Parce qu'avec le peu d'informations que vous avez données, je n'ai pas pu résoudre mon problème. Quelques détails supplémentaires sur les fichiers pom.xml, web.xml et java pourraient faire un meilleur travail. Ou référez-vous à un blog ou un article qui guide le lecteur dans un tutoriel pour Jersey 2.x
Paulo Oliveira
1
@Siddharth l'article lié était censé montrer quelques approches pour résoudre le problème. Si vous trouvez des informations manquantes dans cet article, faites-le moi savoir. Ou vous pouvez toujours fournir votre solution en réponse à cette question.
Michal Gajdos
34

Si vous utilisez jersey 2.x, vous avez besoin d'une configuration différente dans web.xml car la classe de servlet est modifiée. vous pouvez mettre à jour votre web.xml avec la configuration suivante.

    <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>
p27
la source
9
Avez-vous réellement besoin d' unité: WidgetPU ? Je pense que la réponse pourrait être simplifiée en la supprimant.
Nikita Bosik
1
Ce paramètre n'est pas lié à Jersey <init-param> <param-name> unit: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan
22

Ajouter ceci dans 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>
user1249655
la source
2
jersey-core est une dépendance de jersey-server et beaucoup ne sont pas nécessaires pour ajouter explicitement
Kalpesh Soni
OK, ce qui nous est arrivé, c'est que nous avons fait passer jersey-server de 1.0.2 à 1.11 et que la classe "ServletContainer" est soudainement AWOL. On dirait qu'il a été déplacé dans cette version et dans les versions futures vers le package jersey-servlet réf: developer.jboss.org/thread/221647?tstart=0
rogerdpack
15

C'est un problème de configuration d'éclipse, pas un problème de Jersey.

À partir de ce thread ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Cliquez avec le bouton droit sur Propriétés de votre projet eclipse -> Assemblage de déploiement -> Ajouter -> Entrées du chemin de construction Java -> Dépendances Gradle -> Terminer.

Donc, Eclipse n'utilisait pas les dépendances Gradle au démarrage d'Apache.

Adi
la source
1
J'ai passé tellement de temps pour ce problème, j'ai sauvé ma journée!
Tushar Thakur
3

essaye ça :

org.glassfish.jersey.servlet.ServletContainer

sur la classe servlet

Pichitron
la source
2

J'ai eu le même problème que vous même si j'ai suivi un guide différent: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

La partie étrange est que, dans ce guide que j'ai utilisé, je ne devrais avoir aucun problème de compatibilité entre les versions (1.x contre 2.x) car en suivant le guide, vous utilisez le maillot 1.8.x sur pom.xmlet dans le auquel web.xmlvous vous référez une classe ( com.sun.jersey.spi.container.servlet.ServletContainer) comme dit précédemment de la version 1.x. Donc, comme je peux en déduire, cela devrait fonctionner.

Je suppose que parce que j'utilise JDK 1.7, cette classe n'existe plus.


Après, j'ai essayé de résoudre avec les réponses avant les miennes, je n'ai pas aidé, j'ai apporté des modifications sur pom.xmlet sur web.xmll'erreur a changé en:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Ce qui devrait exister!

Suite à cette erreur, j'ai trouvé une "nouvelle" solution: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Avec Maven (archétypes), générez un projet de maillot, comme ceci:

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

Et cela a fonctionné pour moi! :)

Paulo Oliveira
la source
2

J'ai également rencontré un problème similaire. Résolution du problème en suivant le didacticiel de l'étape étape à partir du lien ci-dessous.

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

  • La principale chose à noter est que les bibliothèques jersey doivent être correctement placées dans le dossier TOMCAT WEB-INF / lib. Cela se fait automatiquement par les paramètres Eclipse mentionnés dans le lien ci-dessus. Il créera un fichier WAR avec les fichiers JAR dépendants. Sinon, vous rencontrerez des problèmes avec l'exception ClassNotFound.

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

"23/11/2014 00h06 130458 jersey-client-1.9.jar

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

23/11/2014 00h06 147,952 jersey-json-1.9.jar

23/11/2014 00:06 713 089 jersey-server-1.9.jar "4 fichier (s) 1450238 octets

  • Le deuxième didacticiel explique comment créer un service Web qui produit et consomme une sortie JSON.

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

Les deux liens ont donné une bonne idée de la façon dont les choses fonctionnent et permettent de gagner beaucoup de temps.

yogishaj
la source
1

Nous obtenons cette erreur en raison d'un problème de chemin de compilation. Vous devez ajouter des bibliothèques " Server Runtime " dans le chemin de construction.

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

Veuillez suivre les étapes ci-dessous pour résoudre l'exception de classe introuvable.

Faites un clic droit sur project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Sachin GN
la source
0

J'ai rencontré la même erreur aujourd'hui alors que j'utilisais Jersey 1.x et que j'avais les bons fichiers jar dans mon classpath. Pour ceux qui aimeraient suivre le tutoriel vogella à la lettre et utiliser les jar 1.x, vous devrez ajouter les bibliothèques de jersey au dossier WEB-INF / lib. Cela résoudra certainement le problème.

Rickygrimes
la source
J'ai la même erreur (en utilisant la version 1.18.1 de jersey-server, jersey-core, jersey-servlet) mais l'artefact éclaté créé par IntelliJ Idea est un seul dossier WEB-INF avec un dossier classes à l'intérieur et un fichier web.xml. le dossier contient uniquement la Hello.class
skiabox
0

vous devez ajouter jersey-bundle-1.17.1.jarà la bibliothèque du projet

<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
la source
0

Vous devez remplacer dans votre 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>

pour ça:

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

ceci est Jersey 2.x utilise les packages org.glassfish.jersey au lieu de com.sun.jersey (qui est utilisé par Jersey 1.x) et donc l'exception. Notez que le paramètre init-param commençant par com.sun.jersey ne sera pas reconnu par Jersey 2.x une fois que vous aurez migré vers JAX-RS 2.0 et Jersey 2.x

si à tout moment vous utilisez maven, votre pom.xml serait ceci:

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

remplacez 2.X par la version souhaitée, par exemple 2.15

Juan David Grisales Garzon
la source
0

Une solution simple est de vérifier si vous avez des dépendances ou des bibliothèques dans l'assemblage de déploiement d'eclipse. Probablement si vous utilisez tomcat, le serveur n'a peut-être pas identifié les bibliothèques que nous utilisons. dans ce cas, spécifiez-le explicitement dans l'assembly de déploiement.

éclat
la source
0

Revenant au problème d'origine - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Comme indiqué à juste titre ci-dessus, dans la version JAX 2.x, la classe ServletContainer a été déplacée vers le package - org.glassfish.jersey.servlet.ServletContainer. Le fichier jar associé est jersey-container-servlet-core.jar qui est fourni dans le fichier jaxrs-ri-2.2.1.zip

JAX RS peut être élaboré sans mvn en copiant manuellement tous les jars contenus dans le fichier zip jaxrs-ri-2.2.1.zip (j'ai utilisé cette version, fonctionnerait avec n'importe quelle version 2.x) dans le dossier WEB-INF / lib. La copie des bibliothèques dans le bon dossier les rend disponibles au moment de l'exécution.

Cela est nécessaire si vous utilisez eclipse pour créer et déployer votre projet.

Andy1625
la source
0

Dans le fichier pom.xml, nous devons ajouter

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

La même erreur et gaspillé plus de 2 heures de débogage et d'essayer toutes les options. Je n'utilisais pas le Maven / POM, donc je ne pouvais pas tirer parti de cette solution donnée par quelques-uns.

Finalement, ce qui suit l'a résolu: Ajout des jars directement dans le dossier tomcat / lib (PAS WEB-INF \ lib) et redémarrage du tomcat.

Velu
la source
0

Si quelqu'un essaie de créer une application hello world en utilisant Jersey, je pense que l'un des moyens les plus simples est de suivre la documentation de Jersey.

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

Si vous utilisez déjà maven, cela ne prendrait que quelques minutes pour voir le résultat.

J'ai utilisé ci-dessous.

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

Cela dépend essentiellement de la version du maillot que vous utilisez. Si vous utilisez Jersey ver.1.XX, vous devez ajouter

Jersey 1 utilise " com.sun.jersey " et Jersey 2 utilise org.glassfish . sur la balise de classe de servlet. Notez également que le paramètre init-param commençant par com.sun.jersey ne sera pas reconnu par Jersey 2.

Et ajoutez tout le fichier jar dans le dossier lib WEB-INF

Arun
la source