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é!!
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.
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.
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.
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.