Spring启动 - java.lang.ClassNotFoundException:javax.servlet.ServletContext并且无法启动EmbeddedWebApplicationContext

O_k*_*O_k 14 grails spring-boot

我有一个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
Run Code Online (Sandbox Code Playgroud)

我尝试在构造函数中建议添加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
Run Code Online (Sandbox Code Playgroud)

这篇文章建议删除javax-servlet-api:Spring引导 - 由于缺少EmbeddedServletContainerFactory bean,无法启动EmbeddedWebApplicationContext

但后来我面对原来的问题.

有什么想法吗?

O_k*_*O_k 34

问题出在build.gradle上

provided "org.springframework.boot:spring-boot-starter-tomcat"
Run Code Online (Sandbox Code Playgroud)

Intellij对提供的内容不满意

我一切换到

compile "org.springframework.boot:spring-boot-starter-tomcat"
Run Code Online (Sandbox Code Playgroud)

该应用程序工作

  • 在maven中,我改变了这样的范围:`<scope>提供</ scope>`到`<scope> compile </ scope>`并且它工作!! 谢谢你的解决方案. (7认同)
  • 请注意,“提供”范围的存在是有原因的。您不希望您的可部署项包含 servlet API 或其他 Web 应用程序服务器工件 - 这可能会在部署您的应用程序时导致各种运行时错误。在我看来,最好使用 Spring Boot Run 配置来修复上述错误。 (3认同)

Tec*_*ash 8

使用Maven Spring Boot目标运行: spring-boot:run

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

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


Jac*_*raj 5

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

记住也要有父母的依赖!


小智 5

如果您使用的是 intelliJ idea,则需要启用“在运行中包含具有“提供程序”范围的依赖项-> 编辑配置 -> 应用程序“您的主类”(默认情况下它已禁用) 在此处输入图像描述