刚刚在进行SpringBoot+JSP整合的时候,到了最后一步,启动程序:提示Unregistering JMX-exposed beans on shutdown,程序根本就没有跑起来,在网上查询一番之后,发现是tomcat的问题。
原因在于Application 运行时缺少一个容器container。也就是说在运行时缺少一个tomcat作为容器。
我们先看一下pom.xml文件的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot内嵌的tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--jstl标签依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--用于编译jsp的依赖,因为springboot内嵌的tomcat是不支持jsp的,所以要依赖外部的tomcat-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
我先给出解决方案吧,然后再剖析原因,以免大家着急。
解决方法就是把最下面引入的外部的tomcat依赖的scope属性的值改为compile,如图,我的问题就解决了。
接下来,剖析一下部分原因:
众所周知,springboot默认对jsp没有太多的支持。其内嵌的tomcat也不支持jsp。
因此,要想整合springboot+jsp,需要引入外部的tomcat依赖,并且打包方式选为war。
至于为什么要改依赖的scope属性,首先要知道该属性拥有的值的作用。
我说一下provided和compile的区别
compile:
默认就是compile,什么都不配置就是意味着compile。compile表示被依赖项目(即我们添加的外部tomcat)需要参与当前项目的编译,及其后面的测试,运行周期也都会参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
【ps:由于默认就是compile,因此才会产生有些人没有设置scope属性,没有报错,结果你设置了scope,却报错了。说明你填充的scope属性的值不恰当】
provided:
provided表明被依赖项目只在项目编译和测试的时候参与,其他时候不参与。
因此也就很好的解释了 ,为什么最初会报错 Application在运行的时候缺少一个容器container。因为tomcat没有参与到运行期中。
下面这张表清楚的阐述了scope属性的各个值参与了项目的哪些过程:
好了,本次的问题就到此结束了。如果错误,欢迎各位大佬批评指正哈。