spring boot 对于jsp支持的限制
对于jsp的支持,Spring Boot官方只支持了war的打包方式,不支持fat jar。参考官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations
这里spring boot官方说是tomcat的问题,实际上是spring boot自己改变了打包格式引起的。参考之前的文章:http://hengyunabc.github.io/spring-boot-classloader/#spring-boot-1-3-%E5%92%8C-1-4-%E7%89%88%E6%9C%AC%E7%9A%84%E5%8C%BA%E5%88%AB
原来的结构之下,tomcat是可以扫描到fat jar里的META-INF/resources
目录下面的资源的。在增加了BOOT-INF/classes
之后,则tomcat扫描不到了。
那么怎么解决这个问题呢?下面给出一种方案,来实现对spring boot fat jar/exploded directory的jsp的支持。
个性化配置tomcat,把BOOT-INF/classes 加入tomcat的ResourceSet
在tomcat里,所有扫描到的资源都会放到所谓的ResourceSet
里。比如servlet 3规范里的应用jar包的META-INF/resources
就是一个ResourceSet
。
现在需要想办法把spring boot打出来的fat jar的BOOT-INF/classes
目录加到ResourceSet
里。
下面通过实现tomcat的 LifecycleListener
接口,在Lifecycle.CONFIGURE_START_EVENT
事件里,获取到BOOT-INF/classes
的URL,再把这个URL加入到WebResourceSet
里。
1 | /** |
为了让spring boot embedded tomcat加载这个 StaticResourceConfigurer
,还需要一个EmbeddedServletContainerCustomizer
的配置:
1 |
|
这样子的话,spring boot就可以支持fat jar里的jsp资源了。
demo地址: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample
总结
- spring boot改变了打包结构,导致tomcat没有办法扫描到fat jar里的
/BOOT-INF/classes
- 通过一个
StaticResourceConfigurer
把fat jar里的/BOOT-INF/classes
加到tomcat的ResourceSet
来解决问题