Spring boot - java.lang.ClassNotFoundException:javax.servlet.ServletContext 和无法启动 EmbeddedWebApplica

Posted

技术标签:

【中文标题】Spring boot - java.lang.ClassNotFoundException:javax.servlet.ServletContext 和无法启动 EmbeddedWebApplicationContext【英文标题】:Spring boot - java.lang.ClassNotFoundException: javax.servlet.ServletContext and Unable to start EmbeddedWebApplicationContext 【发布时间】:2016-10-22 15:21:22 【问题描述】:

我有一个 spring boot 应用程序(grails 3.1.8),但是当我在 intellij 中运行该应用程序时,我收到以下错误:

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

我尝试按照Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext 中的建议添加 javax-servlet-api 依赖项

但后来我开始得到:

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 -- Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

但后来我遇到了原来的问题。

有什么想法吗?

【问题讨论】:

【参考方案1】:

问题在于 build.gradle

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

Intellij 对提供的内容不满意

当我切换到

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

应用程序正常运行

【讨论】:

在 maven 中,我将范围更改为:<scope>provided</scope><scope>compile</scope>,它起作用了!!。感谢您的解决方案。 谢谢!像魅力一样工作 请注意,“提供”范围的存在是有原因的。您不希望您的可部署项包含 servlet API 或其他 Web 应用程序服务器工件 - 这可能会在您的应用程序部署时导致各种运行时错误。在我看来,最好使用 Spring Boot Run 配置来修复上述错误。 @Walco 我部分理解您的观点,您能否发布您的解决方案?也许可能是其他人的正确答案。谢谢【参考方案2】:

使用 maven spring boot 目标运行: spring-boot:run

在 IntelliJ 中设置 maven 配置的步骤:

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

【讨论】:

使用此建议而不是直接从 IntelliJ 中的项目资源管理器中运行该类摆脱了我在尝试在 IntelliJ 中调试时看到的 ClassNotFoundException。【参考方案3】:

如果您使用的是 intelliJ IDEA,则需要在 Run -> Edit Configurations -> Application 'your main class' 中启用“包含具有“Provider”范围的依赖项(默认情况下它是禁用的) enter image description here

【讨论】:

【参考方案4】:

在下面添加依赖解决了我的问题:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

记住也要有父依赖!

【讨论】:

感谢这为我解决了这个问题(这里是 spring n00b)。但是它为什么不自动添加呢? - 没有它,项目构建良好,但会因可怕的 java.lang.NoClassDefFoundError: javax/servlet/ServletContext 而崩溃【参考方案5】:

对我来说,这是因为 tomcat 版本。我把tomcat版本从7.5改到8.5,问题解决了。

【讨论】:

【参考方案6】:

Exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext 仅表示您没有向应用程序提供 tomcat 依赖项。如果你们使用的是 intelliJ Idea,那么这样做真的很简单,如下所示。

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

【讨论】:

以上是关于Spring boot - java.lang.ClassNotFoundException:javax.servlet.ServletContext 和无法启动 EmbeddedWebApplica的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring-Boot Banner

Spring Boot:Spring Boot启动原理分析