JeeSite4 Spring Boot启动失败java.lang.NoClassDefFoundError: javax/servlet/ServletContext

今天使用开源项目JeeSite4,在IntelliJ IDEA用Spring Boot运行出错 java.lang.NoClassDefFoundError: javax/servlet/ServletContext

记录一下解决办法:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

尝试将provided修改为compiled但是还是运行不了。最后直接注释<scope>provided</scope>这一行就可以运行了。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <!--<scope>provided</scope>-->
</dependency>


### 三级标题:问题分析与解决方案 `java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream` 异常通常出现在运行时缺少 `javax.servlet-api` 相关依赖的情况下。该类是 Java Servlet 规范的一部分,通常在 Web 应用中由容器(如 Tomcat、Jetty)提供。然而,在某些部署环境或测试环境中,如果未正确引入相关依赖,会导致此类异常。 在 Spring MVC 中进行文件上传操作时,`MultipartResolver` 和相关的控制器方法会使用到 `ServletInputStream` 来读取上传的文件流。若项目构建过程中未将 `servlet-api` 包含在类路径中,则会在运行时抛出 `NoClassDefFoundError`。为了避免此问题,应确保在 `pom.xml` 文件中添加以下依赖: ```xml <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> ``` 上述配置中的 `<scope>provided</scope>` 表示该依赖在编译和测试阶段可用,但在运行时由应用服务器提供。如果是在嵌入式容器(如使用 Spring Boot 的 Tomcat 嵌入模式)中运行,Spring Boot 默认已经包含了该依赖,因此无需额外添加。 此外,若使用的是较旧版本的 Spring Framework 或非 Spring Boot 环境,还需确认是否引入了完整的 Spring Web 模块。例如: ```xml <!-- Spring Web 模块 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency> ``` ### 三级标题:代码示例 以下是一个典型的 Spring MVC 文件上传控制器示例,确保其能够正常运行的前提是已正确引入所有依赖项: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; @Controller public class FileUploadController { @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { // 保存上传的文件到指定路径 String uploadPath = "/path/to/upload/directory/" + file.getOriginalFilename(); file.transferTo(new File(uploadPath)); return "redirect:/success"; } catch (IOException e) { e.printStackTrace(); return "redirect:/error"; } } return "redirect:/"; } } ``` 同时,确保在 Spring 配置类或 XML 文件中启用了对文件上传的支持,例如配置 `CommonsMultipartResolver` 或使用默认的 `StandardServletMultipartResolver`。 ### 三级标题:相关建议 如果项目中使用的是 Spring Boot 并且希望启用内嵌的文件上传支持,应在 `application.properties` 或 `application.yml` 中添加如下配置以启用多部分请求处理: ```properties spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 对于非 Spring Boot 项目,需在 `web.xml` 中配置 `MultipartConfigElement` 或在 Spring 配置类中显式定义 `MultipartResolver` bean。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值