如何解决这个java.lang.NoClassDefFoundError:org / apache / commons / io / output / DeferredFileOutputStream?

我正在使用下面的代码上传文件到tomcat5.5,它给了我以下例外

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream

你能帮我找出答案吗?

 import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; 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.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class FileUploadServlet */ public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public FileUploadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ @SuppressWarnings("rawtypes") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub boolean isMultipart = ServletFileUpload.isMultipartContent(request); System.out.println("Status : "+isMultipart); if (isMultipart) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List items = upload.parseRequest(request); Iterator iterator = items.iterator(); while (iterator.hasNext()) { FileItem item = (FileItem) iterator.next(); if (!item.isFormField()) { String fileName = item.getName(); String root = getServletContext().getRealPath("/"); File path = new File(root + "/uploads"); if (!path.exists()) { boolean status = path.mkdirs(); } File uploadedFile = new File(path + "/" + fileName); System.out.println(uploadedFile.getAbsolutePath()); item.write(uploadedFile); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } response.sendRedirect("upload.jsp"); } } 

这是我使用commons-fileupload-1.2.2.jar

特定的exception消息告诉你,类path中缺less上述类。 作为org.apache.commons.io包名提示,所提到的类是http://commons.apache.org/io项目的一部分。

实际上,Commons FileUpload具有Commons IO作为依赖项 。 您还需要在/WEB-INF/lib 下载并删除commons-io.jar

也可以看看:

  • 如何使用JSP / Servlet将file upload到服务器?
  • 如何将JAR库添加到WAR项目而不面临java.lang.ClassNotFoundException? 类pathvs构buildpathvs / WEB-INF / lib
  • 如何在Eclipse项目中导入javax.servlet API?

使用maven依赖

 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> 

或将commons-io.1.3.2.jar下载到lib文件夹中

默认情况下,Struts使用Apache“commons-io.jar”进行file upload。 要解决这个问题,你必须把这个库包含到你的项目依赖库文件夹中。

  1. 直接获取

从官方网站获取“commons-io.jar” – http://commons.apache.org/io/

  1. 从Maven获取

更喜欢的方式是从Maven仓库获取“commons-io.jar”

文件:pom.xml

  <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> </dependency> 

只要把所有的apache的comons jar和file uploadjar放到tomcat的lib文件夹下

如果您在WebSphere容器中收到此错误,请确保正确设置您的Apps类加载策略。 我必须将我的默认值更改为“last last”,并且对于WAR策略也是“Single class loader for application”。 这是因为在我的情况下,commons-io * .jar与应用程序一起打包,因此必须先加载。

下载PrimeFaces 4.0 。 它马上解决了我的问题。 我正在使用Glassfish 4.0