web-dev-qa-db-fra.com

java.lang.ClassNotFoundException pour servlet dans Tomcat avec eclipse

Je commence à développer une Java dans Eclipse à l'aide de servlets et je la teste avec le serveur Tomcat sur mon hôte local. J'ai déployé l'application dans Tomcat, mais lorsque j'essaie de charger l'URL cible dans mon navigateur, j'obtiens la trace de pile suivante:

Jul 31, 2013 2:58:31 PM org.Apache.catalina.core.ApplicationContext log
INFO: Marking servlet ImageServlet as unavailable
Jul 31, 2013 2:58:31 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ImageServlet
Java.lang.ClassNotFoundException: test.ImageServlet
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1714)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1559)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:527)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:509)
    at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:137)
        at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1144)
    at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:865)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:136)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
    at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:953)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1023)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
    at org.Apache.Tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.Java:1852)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at Java.lang.Thread.run(Unknown Source)  

La classe ImageServlet se trouve assez clairement dans le dossier myproject/src/test de mon espace de travail Eclipse, où myproject est le nom du projet Eclipse et test est le package.

web.xml se trouve dans myproject/web/WEB-INF/web.xml et myproject.xml se trouve dans myproject/myproject.xml

Le contenu de web.xml est:

<?xml version="1.0"?>
<web-app 
xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>test.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/image</url-pattern>
    </servlet-mapping>
</web-app>

Et le contenu de myproject.xml est:

Quelqu'un peut-il me montrer comment corriger mon code afin qu'il ne lève pas l'exception ClassNotFoundException?

10
CodeMed

Parfois, lors de la création de filtres ou de servlets, le fichier de classe n'est pas généré dans le dossier de construction dans Eclipse. Nettoyez l'application et créez-la une fois, un fichier .class est généré dans celui au-dessus dudit chemin. Cela supprime l'erreur de classe non trouvée dans certains cas.

20
srinivas

J'ai récemment rencontré ce problème avec l'un de mes projets (je dis cela parce que l'autre fonctionnait parfaitement bien malgré l'utilisation des mêmes JAR et tout). J'ai essayé de nettoyer le projet plusieurs fois, j'ai supprimé le dossier .metadata plusieurs fois. Rien n'a fonctionné. Les classes n'étaient tout simplement pas compilées.

Ce qui a fonctionné a été de supprimer une bibliothèque jre6 non liée dans le chemin de génération du projet.

3
anuvab1911
  1. Faites un clic droit sur le projet et allez dans "Propriétés"
  2. Allez dans "Assemblage de déploiement"
  3. Assurez-vous que vous disposez de deux mappages comme indiqué dans l'image suivante. Assemblage de déploiement Web dans Eclipse . Sinon, ajoutez les mappages manquants.
  4. Cliquez sur appliquer.
  5. Nettoyez, générez et exécutez votre projet.
2
Mrinal N

c'est un projet maven? dans les projets maven src/test est l'emplacement des tests unitaires et est exclu de la construction et de la guerre, essayez de changer le nom du package et réessayez.

2
Grubhart

On dirait que vous construisez un projet basé sur Maven et que vous placez votre classe au mauvais endroit

Tu devrais utiliser src/main/Java pour mettre vos cours, et src/test/Java pour y mettre vos tests (ie, tests JUnit, si vous en avez).

2
Cristian Meneses

Si votre projet est un projet Maven, vous pouvez essayer de le nettoyer. Cliquez sur Projet> Nettoyer et sélectionnez le projet à nettoyer.

Parfois, si vous utilisez Maven avec la console et Eclipse, la cible devient "folle" et la seule façon de continuer est de nettoyer le projet.

1
russellhoff

S'il n'y a pas de classe test.ImageServlet dans votre déploiement WEB-INF/classes, alors Tomcat ne pourra pas le trouver.

Je suppose que vous n'avez pas compilé, empaqueté et déployé correctement le fichier WAR sur Tomcat.

1
duffymo