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
:
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?
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 .
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:
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.
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>
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.
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.
3. Ajoutez les fichiers jar du chemin de construction dans Assembly afin de pouvoir les ajouter à dossier lib dans le fichier war final.
4. L'assemblage mis à jour ressemblera à ceci.
Cliquez sur ok . Maintenant vous êtes prêt à partir.
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>
Ajouter la bibliothèque Jersey au chemin de construction sous la bibliothèque
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.
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):
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.