web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

Je développe un servlet qui reçoit une demande en plusieurs parties avec un contenu de plusieurs fichiers et j'utilise des bibliothèques de téléchargement de fichiers Apache commons.

Lorsque j'appelle la méthode parseRequest(request);, le servlet lève l'exception suivante:

Grave: Servlet.service() for servlet DiffOntology threw exception
Java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    at org.Apache.commons.fileupload.servlet.ServletRequestContext.getContentType(ServletRequestContext.Java:73)
    at org.Apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.Java:882)
    at org.Apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.Java:331)
    at org.Apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.Java:349)
    at org.Apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.Java:126)
    at DiffOntology.doPost(DiffOntology.Java:38)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.Java:738)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:127)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:298)
    at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:852)
    at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:588)
    at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:489)
    at Java.lang.Thread.run(Thread.Java:619)

Je mets toutes les bibliothèques dans WEB-INF/lib.

MODIFIER:

servlet-api.jar se trouve dans le bon répertoire (Tomcat/lib) et toutes les autres bibliothèques sont dans WEB-INF/lib

Je pense que le problème pourrait peut-être être le suivant:.

Comment ça ne marche pas?

Je suis désespéré!!

14
pAkY88

Cela peut se produire lorsque vous avez placé des bibliothèques spécifiques au serveur dans le /WEB-INF/lib ou probablement le JRE/lib de l'application Web. Grande chance que vous ayez copié le /lib/servlet-api.jar de Tomcat dans celui-ci. Tu ne devrais pas faire ça. Cela entraînerait uniquement des collisions dans le chemin de classe, ce qui conduirait à ce type d'erreur et rendrait votre application Web inportable (c'est-à-dire qu'elle est exécutée uniquement sur Tomcat, vous ne pouvez pas l'exécuter sur d'autres serveurs tels que Glassfish, JBoss AS, Websphere. , etc). Vous devez conserver les bibliothèques spécifiques au serveur à leur emplacement par défaut. Nettoyez le /WEB-INF/lib de toutes les bibliothèques spécifiques au serveur et le JRE/lib de toutes les bibliothèques tierces.

Vous y avez probablement copié des bibliothèques spécifiques au serveur car vous n’avez pas pu compiler vos servlets. Copier les bibliothèques dans /WEB-INF/lib est la mauvaise solution. En gros, vous devriez simplement spécifier ces bibliothèques dans le chemin de classe compiletime. Comme vous utilisez Eclipse, vous pouvez le faire facilement: ajoutez d’abord Tomcat dans la vue Servers, puis associez votre projet webapp à l’instance intégrée Tomcat. De cette façon, Eclipse ajoutera automatiquement les bibliothèques spécifiques au serveur au chemin de construction du projet. Sur un tout nouveau projet Web, vous pouvez choisir le serveur lors de l’assistant de création de projet. Sur les projets Web existants, vous pouvez le modifier dans la section Targeted Runtimes dans les propriétés du projet.

Voir également:

14
BalusC

Vous devez avoir incorrectement copié commons-fileupload.jar dans JRE/lib/ext, JRE/lib/endorsed ou le placer autrement sur un chemin de classe qui n'a pas de visibilité sur les API de servlet. Démarrez la machine virtuelle Java avec -verbose:class, qui indiquera quel chemin de classe a chargé la classe ServletFileUpload. Si la classe est chargée ailleurs que WEB-INF/lib, vous devrez la supprimer.

8
Brett Kail

Vieux thread mais peut toujours aider quelqu'un ... J'ai vu que j'avais un jar javax-servlet dans la dépendance incluse dans un scope de test. Je l'ai fait à portée fournie. Vérifiez le graphique de dépendance si vous utilisez Eclipse + Maven.

0
Sandeepraj Singh

Supprimez les fichiers servlet-api.jar ou le fichier d'aide à l'importation commons de JRE/lib ou JRE/lib/ext. Cela m'a aidé à résoudre le problème.

0
Vijay Kumar Kanta