如何解决这个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。 要解决这个问题,你必须把这个库包含到你的项目依赖库文件夹中。
- 直接获取
从官方网站获取“commons-io.jar” – http://commons.apache.org/io/
- 从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