Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext

 

场景描述

项目中用到 spring boot 进行带页面的开发,从 github 上的 simples 中下载了对应的 spring-boot-sample-web-jsp 项目,经简单修改之后死活启动不起来,各种异常。
spring-boot 以简单容易上手为核心宗旨,可为什么在引入 jar 时就会出现这么多问题呢?

异常信息

异常一:

2016-06-17 11:04:14.216 ERROR 4684 --- [main] o.s.boot.SpringApplication               : Application startup failed

java.lang.NoClassDefFoundError: javax/servlet/ServletContext
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
at java.lang.Class.getDeclaredMethods(Class.java:1855)

 

很显然,这是没有找到 ServletContext 类导致的,于是乎,异想天开的添加了 servlet-api 的 jar 包。 
添加之后,出现异常二:

2016-06-17 11:06:13.860 ERROR 224 --- [main] o.s.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.

 


在网上搜索了各种此异常的解决方案都没有解决成功。

解决方案

在经过多次尝试,几乎要放弃的时候,突然想到一个问题,会不会是因为 Intellij 集成 maven 引入 jar 包时scope设置的问题。

仔细检查 pom 文件,发现问题可能出现在一下两个地方:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>1.2.3.RELEASE</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>7.0.68</version>
        <scope>provided</scope>
    </dependency>

 

注释掉两个配置中的

<scope>provided</scope>

问题就这么解决了。

总结

这可能是 Intellij 的一个 bug,在使用 spring-boot 的时候,如果把某个引入的依赖设置为 provided,那么在 Intellij 启动时就会找不到相应的类。因此,此时需要把此项配置给注释掉,但是打包上线的时候并不需要这些依赖,那么在打包的时候就把注释打开,即可。