web-dev-qa-db-fra.com

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Vous pensez peut-être qu'il s'agit d'une question dupliquée, mais aucune des questions portant le même titre ne résout mes problèmes. J'utilise Jersey 2.0 pour créer un service Web RESTful dans Eclipse. J'utilise Tomcat 7.0 comme serveur. J'ai le web.xml suivant:

<?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" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <servlet-name>JAX-RS Servlet</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.shop.domain</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

J'ai un cours simple appelé Hello:

@Path("customers")
public class Hello {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getCustomer() {
        return "hello";
    }
}

J'ai une bibliothèque Jersey appelée jersey:

enter image description here

Chaque fois que j'ai exécuté ce projet, j'ai eu une erreur de

Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Des idées?

11
Tom

Attendez, vous avez dit que vous avez une bibliothèque Jersey appelée jersey, avez-vous créé un User Library et l'avez-vous appelé jersey? Si tel est le cas, essayez de copier vos fichiers jersey dans WebContent -> WEB-INF -> lib

3
Zhenxiao Hao

Je suppose que cela a déjà été répondu, mais je voulais juste ajouter un conseil supplémentaire.

Pour les projets Web dans Eclipse, il est presque toujours conseillé de gérer les dépendances avec Maven. Utilisez un plugin Maven comme M2E. Une fois que vous avez ajouté une dépendance à votre projet Maven, il devrait déployer automatiquement ces bibliothèques sur WEB-INF/lib. Si ce n'est pas le cas (pour quelque raison que ce soit), vous pouvez le faire de manière explicite:

  1. Faites un clic droit sur votre projet dans Explorateur de projets
  2. Sélectionnez Propriétés
  3. Sélectionnez Deployment Assembly
  4. Si Maven Dependencies n'est pas l'une des entrées, les bibliothèques n'ont pas été ajoutées automatiquement. Nous allons donc les ajouter maintenant.
  5. Sélectionnez Ajouter
  6. Sélectionnez Entrées de chemin de construction Java
  7. Sélectionnez les dépendances Maven
  8. Cliquez sur Terminer

Cela devrait ajouter les bibliothèques à WEB-INF/lib, bien que vous ne les voyiez toujours pas dans la vue Explorateur de projets. Mais votre ClassNotFoundException devrait disparaître maintenant.

19
Ebin

Bien que tout ce qui précède puisse s'appliquer (Eclipse n'est pas l'application la plus crédible), assurez-vous d'avoir revérifié vos dépendances maven. Vous devriez noter que pour le maillot 2.19, j'ai dû ajouter ces 2 dépendances maven:

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>
5
Pantelis Natsiavas

J'ai eu ce problème avec Eclipse. Mon projet qui a une configuration très similaire - Jersey 2, Tomcat 7. J'utilise Tomcat depuis Eclipse, et il semble que quelque part, Eclipse ait en quelque sorte oublié comment déployer correctement les bibliothèques sur Tomcat.

J'ai essayé de déployer manuellement mon fichier war sur Tomcat et de le démarrer via startup.sh. Cela a bien fonctionné. Toutefois, si je le lance via Eclipse, je récupère mon contenu Web, mais les classes Jersey ne sont pas présentes. L'API REST ne fonctionne pas. Mon servlet de connexion fonctionne bien, mais pas le maillot. La console a la même erreur:

Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

au démarrage. Donc, il doit y avoir un problème avec la façon dont Eclipse déploie le code vers Tomcat. J'ai essayé d'aller dans les serveurs Eclipse et d'effacer le répertoire de travail, je n'ai rien fait. (pas que ce le serait, pour les classes manquantes). 

La seule chose qui a fonctionné a été d'aller à la configuration de mes serveurs dans Eclipse et de supprimer mon entrée Tomcat, puis d'en créer une nouvelle. Je l'ai fait et cela a été corrigé immédiatement.

1
Damon Smith

Le message est assez simple pour identifier la cause car les bibliothèques Jersey ne sont pas dans classpath.

La première chose à vérifier est la météo. Avez-vous les dépendances définies pour le maillot dans pom.xml ou non . Si ce ne sont pas les dépendances que vous pouvez définir. Si elles sont déjà définies dans pom. xml, ignorez l’ajout de dépendances dans votre pom.xml. 

     <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>

Solution - Ajout de la bibliothèque Jersey dans l'assembly de déploiement

1. Faites un clic droit sur votre projet dans l'explorateur de projets

2. Ouvrez la configuration de l’assemblage de déploiement de votre projet.

 enter image description here

3. Ajoutez les fichiers jar du chemin de construction dans Assembly afin de pouvoir les ajouter à dossier lib dans le fichier war final.

 enter image description here

4. L'assemblage mis à jour ressemblera à ceci.

 enter image description here

Cliquez sur ok . Maintenant vous êtes prêt à partir.

1
Varun

J'observe également le même problème. J'utilise Tomcat8 avec Maven. Si je crée un projet Web dynamique et que j'ajoute toutes les bibliothèques manuellement, le projet fonctionne correctement, mais si j'utilise Maven, l'erreur suivante apparaît:

SEVERE: Servlet [Jersey REST Service] in web application [/EmployeeManagement] threw load() exception
Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
    at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1313)
    at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1164)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:520)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:501)
    at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:120)
    at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1095)
    at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:1031)
    at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4914)
    at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5201)
    at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
    at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1408)
    at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1398)
    at Java.util.concurrent.FutureTask.run(FutureTask.Java:262)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
    at Java.lang.Thread.run(Thread.Java:744)

J'ai ajouté les dépendances suivantes dans le fichier pom.xml:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.21</version>
</dependency>
    <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.21</version>
</dependency>
0
Devil

Ajouter la bibliothèque Jersey au chemin de construction sous la bibliothèque

0
Mohit Singh

Mettre le jersey jar files dans WEB-INF/lib devrait fonctionner.

Si vous ne pouvez pas placer vos fichiers jersey dans WEB-INF/lib , essayez de le copier-coller manuellement en passant par votre espace de travail et en redémarrant Eclipse! Cela a fonctionné pour moi. 

0
saravana kumaran

J'aimerais ajouter que j'avais le même problème et que la réponse de @ Edin fonctionnait, mais j'utilisais IntelliJ. Alors j'ai pensé ajouter un moyen de faire cela pour Intellij (pour les futurs gens comme moi):

  1. Fichier
  2. Structure du projet
  3. Des artefacts
  4. Vous devriez avoir un artefact nommé d'après votre projet, sélectionnez-le
  5. Sur la droite, vous verrez une liste Eléments disponibles
  6. Sélectionnez tous les éléments disponibles, faites un clic droit, puis sélectionnez l'option qui les ajoute au WEB-INF/Lib
0
Miniman

Pour moi, le correctif était le suivant:

Right click on Project -> Properties -> Java Build Path -> Libraries ->
Add Library... -> Server Runtime -> Apache Tomcat v7.0 -> Finish

Une autre étape que j’ai faite a été d’importer des éléments dans Maven, mais ce n’était pas nécessaire, car tout se passe bien sans cela.

Mais le voici s'il aide quelqu'un

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2.1-b03</version>
        <scope>provided</scope>
    </dependency>

mettre des fichiers de servlets dans WEB-INF/lib a tout simplement compliqué les choses, car le message d'exception est devenu plus compliqué et moins pertinent

EDIT: oh, ce qui aide aussi, c'est de faire un projet de mise à jour sur votre projet Maven.

0
kaya