如何解决tomcat10仲javax和jakarta的冲突问题
引用 **org.apache.tomcat.util.http.fileupload.servlet.*** 或 **org.apache.commons.fileupload.servlet.*** 的时候,java文件最开头标出异常:**The type jakarta.servlet.http.HttpServletRequest cannot be resolved. It is indirectly referenced from required .class files**
上网查了一下感觉像是javax的jakarta冲突问题,网上大多数解决方法就是放弃tomcat10用回tomcat9,难道就没有其他更好的解决方法了吗?
环境是 win10 + eclipse-2021-06 + java11 + tomcat-10.0.8 。
另外附上源码,希望会有帮助:
package bag_servlet;
import java.io.*;
import jakarta.servlet.*;
import jakarta.servlet.annotation.*;
import jakarta.servlet.http.*;
import java.util.*;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.RequestContext;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.*;
//import org.apache.commons.fileupload.disk.*;
//import org.apache.commons.fileupload.servlet.*;
//import org.apache.commons.fileupload.FileItem;
//import org.apache.commons.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.servlet.ServletFileUpload;
@SuppressWarnings("serial")
public class ServletUpload extends HttpServlet {
//上传文件存储目录
private static final String UPLOAD_DIRECTORY = "upload";
//上传配置
private static final int MEMORY_THRESHOLD = 1024*1024*3; //3MB
private static final int MAX_FILE_SIZE = 1024*1024*40; //40MB
private static final int MAX_REQUEST_SIZE = 1024*1024*50; //50MB
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//检查是否为多媒体上传
if(false == ServletFileUpload.isMultipartContent((RequestContext) req)) {
//如果不是则停止
PrintWriter writer = resp.getWriter();
writer.println("ERROR:表单必须包含enctype=multipart/form-data");
writer.flush();
return;
}
//配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存临界值,超过后将产生临时文件并储存与临时目录
factory.setSizeThreshold(MEMORY_THRESHOLD);
//设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
//设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
//舌质最大请求值(包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
//中文处理
upload.setHeaderEncoding("UTF-8");
//构造临时路径存储上传的文件
//这个路径相对当前应用的目录
String uploadPath = req.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;
//如果目录不存在则创建
File uploadDir = new File(uploadPath);
if(false == uploadDir.exists()) {
uploadDir.mkdir();
}
try {
//解析请求的内容提取文件数据
//@SuppressWarnings("unchecked")
List<FileItem> formItems = upload.parseRequest((RequestContext) req);
if(formItems != null && formItems.size() > 0) {
//迭代表单数据
for(FileItem item: formItems) {
//处理不在表单中的字段
if(false == item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator +fileName;
File storeFile = new File(filePath);
//在控制台输出文件的上传路径
System.out.println(filePath);
//保存文件到硬盘
item.write(storeFile);
req.setAttribute("message", "文件上传成功!");
}
}
}
}
catch(Exception e) {
req.setAttribute("message", "错误信息:" + e.getMessage());
}
//跳转到message.jsp
req.getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);
}
}