关于Java:Spring启动JSP错误:NoClassDefFoundError

Spring boot JSP error: NoClassDefFoundError

每次我尝试运行配置有JSP的spring boot app时,都会出现此错误:

1
2
3
4
5
6
7
8
9
10
11
java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
.............
[more errors/exceptions]
.............
Exception in thread"main" java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)

我尝试运行示例:spring-boot-sample-web-jsp和spring-boot-sample-web-jsp

这些样品的结果相同。我使用IntelliJ IDEA运行应用程序,但没有IDEA为什么它不起作用。


IntelliJ中存在一个错误,这意味着所提供的依赖项未添加到类路径中。假设您要坚持使用IDEA,则有以下几种选择:

  • 在IDEA中手动配置类路径
  • 使用mvn spring-boot:run在命令行上运行示例
  • 从pom中删除所有出现的<scope>provided</scope>。这意味着该应用不能作为对Tomcat或类似产品的战争来部署

编辑:只要您在运行配置中的类路径下,选中"使用"提供的"作用域包括依赖项"复选框,该错误便已修复并且服务器将正常启动。


在错误报告中建议了另一种解决方法。

您可以按照Spring文档中的建议使用<scope>provided</scope>,然后在IntelliJ中进入"项目设置"。对于有问题的模块,在"依赖关系"选项卡中,您应该看到与spring-boot-starter-tomcat相关的依赖关系都列为"已提供"。将它们更改为"编译"应强制IntelliJ将它们添加到类路径中。

它的优点是既不需要对pom.xml进行任何修改,又可以使用IntelliJ提供的Spring Boot集成。


我找到了一个更好的解决此错误的方法。

如果直接使用命令行运行项目,则将失去IDE提供的调试功能。您可以单击Maven Project选项卡,找到spring-boot:run goal,右键单击然后选择debug XXXX。通过这种方式,您可以获得IDE提供的完整调试功能。