web-dev-qa-db-fra.com

exception java.lang.ClassNotFound: com.Sun.jersey.spi.container.servlet.ServletContainer

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

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

Mais le serveur continue à 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 bundle à partir de ici et j'ai ajouté tous les fichiers jar dans le dossier WEB-INF/lib comme décrit dans le didacticiel. Et même après deux jours, rien ne fonctionne. J'ai effectué plusieurs recherches sur Google et, apparemment, les utilisateurs de Maven l'ont résolu, mais je n'utilise pas Maven, pas plus que celui qui a écrit ce didacticiel. 

Juste pour vérifier si même com.Sun.jersey.spi.container.servlet.ServletContainer existe dans Jersey jars importé, j'ai essayé d'écrire ce nom pleinement qualifié en Java et laisser l'intellisense terminer les noms, mais je n'ai pas pu obtenir d'intellisense après com.Sun.je. Ma dernière hypothèse est qu'il y a eu quelques paquetages. réarrangement dans la dernière version de Jersey et jersey n'est plus dans com.Sun. Je suis épuisé et j'apprécierais toute aide. 

77
M-WaJeEh

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écharger Jersey 1.17.1 à partir de ( ici ) devrait vous suffire.

Jersey 1 utilise com.Sun.jersey et Jersey 2 utilise org.glassfish.jersey, d'où l'exception. 

Notez également que init-param commençant par com.Sun.jersey ne sera pas reconnu par Jersey 2.

Modifier

Enregistrement de ressources et de fournisseurs dans Jersey 2 contient des informations supplémentaires sur la procédure d’enregistrement de classes/instances dans Jersey 2. 

144
Michal Gajdos

Si vous utilisez jersey 2.x, vous aurez besoin d'une configuration différente dans web.xml, car la classe de servlet est modifiée. vous pouvez mettre à jour votre fichier 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>
28
p27

Ajouter ceci en 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>
22
user1249655

C'est un problème de configuration Eclipse, pas un problème de Jersey.

A partir de ce fil ClassNotFoundException: com.Sun.jersey.spi.container.servlet.ServletContainer

Cliquez avec le bouton droit de la souris sur vos propriétés de projet Eclipse -> Assemblage de déploiement -> Ajouter -> Entrées du chemin de construction Java -> Dépendances Gradle -> Terminer.

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

8
Adi

essaye ça : 

org.glassfish.jersey.servlet.ServletContainer

sur la classe de servlet

3
Pichitron

J'ai également fait face à un problème similaire. Résolu le problème en parcourant le didacticiel étape par é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 de maillots doivent être placées correctement 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 ClassNotFound Exception.

Apache-Tomcat-7.0.56-windows-x64\Apache - Tomcat-7.0.56\webapps\JerseyJSONExample\WEB-INF\lib

"23/11/2014 00:06 AM 130,458 jersey-client-1.9.jar

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

23/11/2014 00:06 AM 147,952 jersey-json-1.9.jar

23/11/2014 00:06 713,089 jersey-server-1.9.jar " 4 Fichier (s) 1,450,238 octets

  • Le deuxième tutoriel explique comment créer un Webservice qui produit et utilise une sortie JSON.

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

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

2
yogishaj

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

Ce qui est étrange, c’est que, dans ce guide que j’ai utilisé, je n’ai aucun problème de compatibilité entre les versions (1.x par rapport à 2.x), car si vous suivez ce guide, vous utilisez le maillot 1.8.x sur pom.xmlet dans web.xmlvous faites référence. une classe (com.Sun.jersey.spi.container.servlet.ServletContainer) comme dit auparavant de la version 1.x. Donc, comme je peux en déduire, cela devrait fonctionner.

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


Après, j'ai essayé de résoudre avec les réponses avant le mien, n'a pas aidé, j'ai apporté des modifications sur le pom.xmlet sur le web.xml l'erreur est passée à: Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Ce qui devrait être exister!

À la suite de 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, aime ceci:

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

Et ça a fonctionné pour moi! :)

2
Paulo Oliveira

Nous avons cette erreur à cause d'un problème de chemin de construction. Vous devez ajouter les bibliothèques " Server Runtime " au 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 non trouvée.

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

1
Sachin G N

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

0
rickygrimes

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>

0
AhmadReza

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

Enfin, les éléments suivants l’ont résolu: Ajout des fichiers jar directement dans le dossier Tomcat/lib (NOT WEB-INF\lib) et redémarrage de Tomcat.

0
Velu

Si quelqu'un essaie de créer une application Hello World avec Jersey, je pense qu'une des manières les plus simples est de suivre la documentation de Jersey. 

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

Si vous utilisez déjà Maven, le résultat ne prendra que quelques minutes.

J'ai utilisé ci-dessous.

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

Revenons au problème initial - 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 pot correspondant est jersey-container-servlet-core.jar qui vient emballé dans le jaxrs-ri-2.2.1.Zip

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

Cela est nécessaire si vous utilisez Eclipse pour générer et déployer votre projet.

0
Andy1625

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

Jersey 1 utilise " com.Sun.jersey ", et Jersey 2 utilise org.glassfish . sur la balise de classe servlet. Notez également que même 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

0
Arun

Dans le fichier pom.xml, nous devons ajouter

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

Une solution simple consiste à vérifier si vous avez des dépendances ou des bibliothèques dans Assembly de déploiement d'Eclipse. 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 Assembly de déploiement.

0
shine

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>

jersey 2.x utilise les packages org.glassfish.jersey à la place de com.Sun.jersey (utilisé par Jersey 1.x) et constitue donc une exception. Notez que même 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, à un moment quelconque, vous utilisez maven, votre fichier pom.xml serait le suivant:

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

remplacez 2.X pour la version de votre choix, par exemple 2,15