java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory

java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory,java,servlets,classnotfoundexception,apache-commons-fileupload,Java,Servlets,Classnotfoundexception,Apache Commons Fileupload,我正试图通过ApacheTomcat8.0.14编译UploadServletservlet。 我的web.xml很好,UploadServlet.java已正确编译,但在尝试运行时出现以下错误 错误 HTTP Status 500 - Error instantiating servlet class UploadServlet exception javax.servlet.ServletException: Error instantiating servlet class Upload

我正试图通过ApacheTomcat8.0.14编译
UploadServlet
servlet。 我的web.xml很好,
UploadServlet.java
已正确编译,但在尝试运行时出现以下错误

错误

HTTP Status 500 - Error instantiating servlet class UploadServlet

exception
javax.servlet.ServletException: Error instantiating servlet class UploadServlet

root cause
java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory

root cause
java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
UploadServlet.java

import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){

      filePath =  getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {

      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }

      DiskFileItemFactory factory = new DiskFileItemFactory();

      factory.setSizeThreshold(maxMemSize);

      factory.setRepository(new File("C:\\apache-tomcat-8.0.14\\temp"));


      ServletFileUpload upload = new ServletFileUpload(factory);

      upload.setSizeMax( maxFileSize );

      try{ 

      List fileItems = upload.parseRequest(request);

      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {

            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            System.out.println(fileName);

            if( fileName.lastIndexOf("\\") >= 0 )
            {
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\"))) ;
            }
            else
            {
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}
import java.io.*;
导入java.util.*;
导入javax.servlet.ServletConfig;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.FileUploadException;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
导入org.apache.commons.io.output.*;
公共类UploadServlet扩展了HttpServlet{
私有布尔是多重的;
私有字符串文件路径;
private int maxFileSize=50*1024;
私有整数maxmesize=4*1024;
私有文件;
公共void init(){
filePath=getServletContext().getInitParameter(“文件上载”);
}
public void doPost(HttpServletRequest请求,
HttpServletResponse(响应)
抛出ServletException,java.io.IOException{
isMultipart=ServletFileUpload.isMultipartContent(请求);
response.setContentType(“text/html”);
java.io.PrintWriter out=response.getWriter();
如果(!isMultipart){
out.println(“”);
out.println(“”);
out.println(“Servlet上传”);
out.println(“”);
out.println(“”);
out.println(“没有上传文件”

”; out.println(“”); out.println(“”); 返回; } DiskFileItemFactory=新的DiskFileItemFactory(); factory.setSizeThreshold(maxMemSize); setRepository(新文件(“C:\\apache-tomcat-8.0.14\\temp”); ServletFileUpload upload=新的ServletFileUpload(工厂); upload.setSizeMax(maxFileSize); 试试{ List fileItems=upload.parseRequest(请求); 迭代器i=fileItems.Iterator(); out.println(“”); out.println(“”); out.println(“Servlet上传”); out.println(“”); out.println(“”); 而(i.hasNext()) { FileItem fi=(FileItem)i.next(); 如果(!fi.isFormField()) { 字符串fieldName=fi.getFieldName(); 字符串文件名=fi.getName(); 字符串contentType=fi.getContentType(); 布尔值isInMemory=fi.isInMemory(); long-sizeInBytes=fi.getSize(); System.out.println(文件名); 如果(fileName.lastIndexOf(“\\”>)=0) { 文件=新文件(文件路径+ fileName.substring(fileName.lastIndexOf(“\\”); } 其他的 { 文件=新文件(文件路径+ fileName.substring(fileName.lastIndexOf(“\\”+1)); } fi.写入(文件); out.println(“上传的文件名:“+Filename+”
”; } } out.println(“”); out.println(“”); }捕获(例外情况除外){ 系统输出打印项次(ex); } } 公共无效数据集(HttpServletRequest请求, HttpServletResponse(响应) 抛出ServletException,java.io.IOException{ 抛出新的ServletException(“GET方法用于”+ getClass().getName()+“:需要POST方法。”); } }
作为@Gas,我忘了在WEB-INF/lib文件夹中添加.jar文件。然后问题就解决了。

您需要将
commons fileupload.jar
commons io.jar
放在
WEB-INF/lib
文件夹中。类路径在构建期间使用,但它们也必须在运行时可用


事实上,如果您使用IDE进行JavaEE开发(如Eclipse),将这些JAR放到
WEB-INF/lib
就足够了,因为它们将在CLAPATH for build中自动可见

正如它所说的:类路径上没有类org.apache.commons.fileupload.FileItemFactory您是使用maven构建项目的吗?我不知道maven是什么。仅供参考,我正在使用sublime文本编辑器,无论您在编译commons时使用了什么JAR,也可以在部署时添加它们。我在classpath中提到过它们。commons-io-2.4.jar,commons-fileupload-1.3.1.jar。这还不够吗?您需要将commons-fileupload.jar和commons-io.jar放在WEB-INF/lib文件夹中。类路径在构建期间使用,但它们也必须在运行时可用。