Spring Boot - java.lang.ClassNotFoundException:javax.servlet.ServletContext 和无法启动 EmbeddedWebApplicationContext

问题描述 投票:0回答:8

我有一个 Spring Boot 应用程序 (Grails 3.1.8),但是当我在 IntelliJ IDEA 中运行该应用程序时,出现以下错误:

Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:292)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:232)
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:510)
    ... 26 common frames omitted
Caused by: 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)
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152)
    ... 29 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 33 common frames omitted

我尝试按照对构造函数抛出异常的答案中的建议添加 javax-servlet-api 依赖项;嵌套异常是 java.lang.NoClassDefFoundError: javax/servlet/ServletContext

但后来我开始意识到:

ERROR org.springframework.boot.SpringApplication - Application startup failed org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at grails.boot.GrailsApp.run(GrailsApp.groovy:55) at grails.boot.GrailsApp.run(GrailsApp.groovy:374) at grails.boot.GrailsApp.run(GrailsApp.groovy:363) at grails.boot.GrailsApp$run.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) at closemytab.Application.main(Application.groovy:13) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ... 18 common frames omitted
这篇文章建议删除 javax-servlet-api: 

Spring boot -- 由于缺少 EmbeddedServletContainerFactory bean,无法启动 EmbeddedWebApplicationContext

但随后我面临最初的问题。

有什么想法吗?

grails spring-boot
8个回答
56
投票
问题出在

build.gradle 文件上:

provided "org.springframework.boot:spring-boot-starter-tomcat"

IntelliJ IDEA 对提供的内容不满意。

当我切换到

compile "org.springframework.boot:spring-boot-starter-tomcat"
应用程序有效。


17
投票
使用

Maven Spring Boot 目标运行:

spring-boot:run


IntelliJ IDEA 中设置 Maven 配置的步骤

菜单

调试/运行配置 → 单击左上角可见的 + 按钮 → 选择 Maven → 将命令行设置为 spring-boot:run


16
投票
如果您使用的是 IntelliJ IDEA,则需要启用“在菜单中包含具有“Provider”范围的依赖项

运行编辑配置应用程序→'您的主类'(默认情况下它是禁用的)

Enter image description here


5
投票
添加下面的依赖项解决了我的问题:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
记住也要有父依赖!


1
投票
对我来说,是因为Tomcat版本的原因。我将Tomcat版本从7.5更改为8.5,问题解决了。


1
投票

Exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext

 仅表示您没有向应用程序提供 Tomcat 依赖项。如果您使用的是 
IntelliJ IDEA,那么操作起来非常简单,如下所示。

选择您的项目 → 打开 Maven 面板(它主要位于面板的右上角)→ 选择嵌入。

Click here for a screenshot


0
投票
我对

maven 项目也有同样的问题,我所做的是

    选择修改选项

    选择选项
  1. 将具有“提供”范围的依赖项添加到类路径

    应用更改


0
投票
我解决了问题更换

implementation 'javax.servlet:jstl' --> implementation group: 'jakarta.servlet.jsp.jstl', name: 'jakarta.servlet.jsp.jstl-api', version: '3.0.0'
    
© www.soinside.com 2019 - 2024. All rights reserved.