web-dev-qa-db-fra.com

ClassNotFoundException lors du démarrage de tomcat

J'essaie de créer un service Web REST.

Mon projet ressemble à:

enter image description here

La trace est:

8 déc. 2011 18:31:36 org.Apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production     environments was not found on the Java.library.path: C:\Program Files\MyEclipse\Common\binary\com.Sun.Java.jdk.win32.x86_1.6.0.013\bin;C:\Program Files\MyEclipse\Common\plugins\com.genuitec.Eclipse.easie.Tomcat.myeclipse_9.0.0.me201109141806\Tomcat\bin
8 déc. 2011 18:31:36 org.Apache.coyote.http11.Http11Protocol init
INFO: Initialisation de Coyote HTTP/1.1 sur http-8080
8 déc. 2011 18:31:36 org.Apache.catalina.startup.Catalina load
INFO: Initialization processed in 394 ms
8 déc. 2011 18:31:37 org.Apache.catalina.core.StandardService start
INFO: Démarrage du service Catalina
8 déc. 2011 18:31:37 org.Apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.13
8 déc. 2011 18:31:37 org.Apache.catalina.startup.HostConfig deployWAR
INFO: Déploiement de l'archive Test-0.0.1-SNAPSHOT.war de l'application web
8 déc. 2011 18:31:37 org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:37 org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:38 org.Apache.catalina.core.ApplicationContext log
INFO: La servlet Test JAX-RS REST Servlet est marqué comme indisponible
8 déc. 2011 18:31:38 org.Apache.catalina.core.ApplicationContext log
Grave: Error loading WebappClassLoader
delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.Apache.catalina.loader.StandardClassLoader@19e8329
 com.Sun.jersey.spi.container.servlet.ServletContainer
Java.lang.ClassNotFoundException: com.Sun.jersey.spi.container.servlet.ServletContainer
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1358)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1204)
    at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1083)
    at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:981)
    at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4042)
    at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4348)
    at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:791)
    at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:771)
    at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:525)
    at org.Apache.catalina.startup.HostConfig.deployWAR(HostConfig.Java:825)
    at org.Apache.catalina.startup.HostConfig.deployWARs(HostConfig.Java:714)
    at org.Apache.catalina.startup.HostConfig.deployApps(HostConfig.Java:490)
    at org.Apache.catalina.startup.HostConfig.start(HostConfig.Java:1138)
    at org.Apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.Java:311)
    at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:117)
    at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1053)
    at org.Apache.catalina.core.StandardHost.start(StandardHost.Java:719)
    at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1045)
    at org.Apache.catalina.core.StandardEngine.start(StandardEngine.Java:443)
    at org.Apache.catalina.core.StandardService.start(StandardService.Java:516)
    at org.Apache.catalina.core.StandardServer.start(StandardServer.Java:710)
    at org.Apache.catalina.startup.Catalina.start(Catalina.Java:566)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.catalina.startup.Bootstrap.start(Bootstrap.Java:288)
    at org.Apache.catalina.startup.Bootstrap.main(Bootstrap.Java:413)

Mon web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee 
    http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 
  <servlet>
    <display-name>Test JAX-RS REST Servlet</display-name>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <servlet-class>
        com.Sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Quelqu'un peut-il m'aider ?

24
Seb P

J'ai rencontré le même problème. J'utilisais la version 1.12.

Je n'ai pas pu trouver la classe com.Sun.jersey.spi.container.servlet.ServletContainer dans "jersey-server-1.12.jar" ou "jersey-core-1.12.jar" comme suggéré dans d'autres forums.

Vous pouvez facilement vérifier cela dans Eclipse lorsque vous l'ajoutez au chemin de génération et que vous remarquez que cette classe n'est pas comprise dans les fichiers JAR mentionnés ci-dessus.

J'ai cherché autour et trouvé le suivant:

Il semble que la classe com.Sun.jersey.spi.container.servlet.ServletContainer se trouve dans un fichier JAR différent ("jersey-servlet-1.12.jar").

Je n'ai trouvé aucune documentation à ce sujet. Cependant, le fait d'avoir ce fichier dans mon WEB-INF/lib a résolu ce problème.

J'espère que cela t'aides.

32
Anjaneya Reddy

Solution:

Ajoutez uniquement la dépendance dans pom.xml:

 <dependency>
      <groupId>com.Sun.jersey</groupId>
      <artifactId>jersey-servlet</artifactId>
      <version>1.13</version>
 </dependency>

Maintenant, votre application aura la classe com.Sun.jersey.spi.container.servlet.ServletContainer

ps: n'oubliez pas de vérifier si les bibliothèques sont envoyées au déploiement Tomcat.

Vérifier:  

Cliquez avec le bouton droit sur votre projet -> Propriétés -> Deployment Assembler et assurez-vous que l'onglet Source contient Maven Dependecies

Autrement:

Cliquez sur le bouton Ajouter -> Chemin de construction Java -> Dépendances Maven -> Terminer.

Prêt lorsque vous exécutez l'application, toutes les bibliothèques seront importées dans le déploiement.

ps: Lorsque le projet Maven est mis à jour, vous devez procéder de nouveau.

35
Diego

Si vous travaillez avec Maven , le problème peut être que vos jars ne sont pas déployés sur votre Tomcat. Ainsi, vous avez vos dépendances Maven dans le chemin de construction Java (Projet> Propriétés> Chemin de construction), mais lorsque vous exécutez le projet sur votre Tomcat depuis Eclipse, les dépendances Maven ne sont pas déployées sur Tomcat. Pour résoudre ce problème, vous devez: cliquer avec le bouton droit de la souris sur> propriétés et sélectionner "Ensemble de déploiement". Et ajoutez des entrées de chemin de construction Java. De cette façon, vous dites au plug-in WTP (celui qui exécute Tomcat dans Eclipse) qu'il doit également copier les fichiers JAR du Maven enter image description here

18
luigi7up

Dans Jersey 2.0 , la mise en œuvre du conteneur de servlets a été modifiée. Vous devez utiliser org.glassfish.jersey.servlet.ServletContainer au lieu de l'ancien com.Sun.jersey.spi.container.servlet.ServletContainer

La classe est en

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

Vous pouvez créer un projet squelettique en utilisant:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeGroupId=org.glassfish.jersey.archetypes -
DinteractiveMode=false -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example -DarchetypeVersion=2.0-m11
9
JasonPlutext

Vous devez placer le répertoire Jersey JAR dans votre répertoire WEB-INF/lib , que vous exécutiez Tomcat séparément ou avec Eclipse.

Cela a fonctionné pour moi.

3
Anupam

Le chargeur de classe ne trouve pas la classe com.Sun.jersey.spi.container.servlet.ServletContainer.

Vous devez placer le fichier JAR de Jersey dans votre répertoire WEB-INF/lib.

Cela pourrait aider:

http://www.suryasuravarapu.com/2009/02/rest-jersey-configuration-on-Tomcat.html

Maintenant, j'ai regardé l'image que vous avez postée et je vois votre problème: vous utilisez Eclipse et Maven, mais vous ne comprenez pas vraiment ce qu'ils font.

Vous devez vous retrouver avec un fichier WAR dans le répertoire Tomcat /webapps qui contient tous les fichiers JAR tiers dont vous avez besoin dans le répertoire WEB-INF/lib. Si vous ne le faites pas, Tomcat ne les trouvera pas.

Je recommanderais de simplifier votre problème. Créez un fichier WAR à la main. Laisse Eclipse et Maven en dehors de ça. Une fois que tout fonctionne, ajoutez les éléments censés vous faciliter la vie. Vous comprendrez ce qu'ils doivent faire, car vous aurez déjà réussi à le faire fonctionner sans eux.

1
duffymo

le poste de luigi7up ci-dessus a fonctionné pour moi. J'utilise Tomcat 7.0.37, maven 3.1.1 et maillot 1.17.1. J'ai fait un clic droit -> Propriétés -> Assemblage de déploiement -> Cliquez sur Ajouter -> Entrées de chemin de construction Java -> Dépendances Maven sélectionnées. J'ai alors cliqué sur OK.

Lorsque j’ai essayé pour la première fois, j’ai remarqué que je ne recevais plus l’erreur "Java.lang.ClassNotFoundException: com.Sun.jersey.spi.container.servlet.ServletContainer", mais j’ai alors remarqué que j’obtenais une autre classe introuvable 'messages (malheureusement, je n'ai pas documenté de quels messages il s'agissait). J'utilisais la dépendance de maillot suivante:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.17.1</version>
</dependency>

Je l'ai pris et mis dans les dépendances suivantes:

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

Les choses ont commencé à fonctionner après cela. 

J'espère que cela aide quelqu'un!

1
Stephen Spalding

Je l'ai ajouté au répertoire WEB-INF/lib mais cela n'a pas fonctionné tant que je n'ai pas actualisé le dossier lib d'Eclipse, puis le travail a commencé.

0
Milind

à partir de: http://jersey.Java.net/nonav/documentation/latest/chapter_deps.html#d4e1687

Le déploiement d'une application sur un conteneur de servlets nécessite une dépendance de déploiement avec ce conteneur.

Consultez la documentation Java ici pour savoir comment configurer le conteneur de servlets.

L'utilisation de servlet: com.Sun.jersey.spi.container.servlet.ServletContainer nécessite une dépendance sur le module jersey-servlet.

Les développeurs Maven utilisant servlet: com.Sun.jersey.server.impl.container.servlet.ServletAdaptor dans un servlet non EE 5 nécessitent en outre une dépendance sur le module persistence-api.

Les développeurs non-Maven ont besoin de: persistence-api.jar

0
Leonid

Anjaneya Reddy, comme vous l'avez fait remarquer, la classe n'est même pas dans le JAR dans lequel elle est supposée être. Ce qui me déconcerte, où est-il et où dans la documentation est-il lié à cela?!?

Maintenant que tout est si convivial avec Maven, il est difficile de lancer un didacticiel simple sans avoir à en dépendre. 

0
Half_Duplex

Il semble que vous ayez besoin de bibliothèques manquantes dans votre chemin de classe de déploiement.

Copiez les fichiers JAR suivants dans le répertoire WEB-INF/lib

asm-3.1.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jersey-client-1.15.jar
jersey-core-1.15.jar
jersey-json-1.15.jar
jersey-server-1.15.jar
jersey-servlet-1.15.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
0
bavan

La dépendance suivante aide:

<dependency>
  <groupId>com.Sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.8</version>
</dependency>

Voir: http://www.mkyong.com/webservices/jax-rs/classnotfoundexception-com-Sun-jersey-spi-container-servlet-servletcontainer/

0
Benny Neugebauer