SpringBoot项目搭建web项目很快,内嵌了tomcat容器,一般来讲直接jar包跑就行了,当然也可以打成war包放到其他的容器中执行。
本文将介绍一下SpringBoot整合resin容器的全过程,包括resin配置,jar包冲突,class not found,中文乱码等各种配置问题解疑
内心os: tomcat不香嘛,为啥要搞个resin出来,对此我也不知道怎么回答,前人就这么玩的,我还能怎么办,只能选择接受… (这东西真是的有点蛋疼)
I. 环境准备
1. resin安装
1.1 下载安装
首先需要下载resin包,进入官网: http://www.caucho.com/download/
选择一个zip包下载到本地,移动到目的地,解压即可,注意这个地址,后续会用到
比如我本机存放地址为 /Users/user/Project/Tool/resin-4.0.61
1.2 IDEA配置
idea首先安装插件
其次进行编译环境配置,选择Edit Configuration
接下来在配置页,依次操作
- 点击
+
- 输入
resin
- 选择
Local
然后按照下图配置
注意:URL这里与你的实际项目有关,后面会说明
还没完,接下来指定发布方式
- 点击
Deployment
- 点击
+
- 选择
Arifact...
- 选中你的项目
最后确定保存之后,本地项目部署到resin运行基本完成
1.3 SpringBoot项目配置
本文实例中springboot版本为 2.2.1.RELEASE
因为我们使用resin容器进行部署,所以会很容易想到将tomcat依赖排除掉(当然不仅于此,后文会深入说明)
1 | <!-- 指定项目打成war包 --> |
II. 项目整合
1. 启动类
启动类,继承自SpringBootServletInitialzer
,因为我们的项目以war包形式在web容器中运行(这一点需要注意,和之前的Spring系列中的启动类有一点区别)
1 |
|
2. rest接口
写两个简单的rest接口,一个返回html文件,一个返回String
1 |
|
在资源路径 resources/static/
下添加html文件index.html
1 | <html> |
3. 启动测试
请注意,这时的启动,不是在main方法上邮件运行,而是借助前面配置的resin,来运行
3.1 ServletException
启动的第一个异常,Error:(13, 8) java: 无法访问javax.servlet.ServletException 找不到javax.servlet.ServletException的类文件
将tomcat排除掉之后,没有Servlet依赖,在编译打包层就会失败,所以需要添加依赖,这里指定了作用域<scope>provided</scope>
1 | <dependency> |
3.2 java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider
jar包冲突,如下图,提示有两个validation-api
, 在项目中我们自己依赖的是jakarta.validation-api-2.0.1
,但是实际采用的是resin的validation-api-1.0.0.GA.jar
出现这个问题,主要就是因为resin自己也提供了一个validation-api
包,但是又不满足我们的需求,所以最好的方法就是用我们需要的版本覆盖掉它的
替换validation-api
- 将项目依赖的api jar包,拷贝到resin目录下的lib下
- 本项目中,将resin中
validation-api-1.0.0.GA.jar
干掉,复制进去validation-api-2.0.1.Final.jar
替换webapp-jars
除了api之外,还有两个也需要配套修改,在resin/webapp-jars
中,有两个jar包,一个是hibernate-validator
, 一个是jboss-logging
- 本项目中,覆盖之后两个版本分别是
- hibernate-validator-6.0.18.Final.jar
- jboss-logging-3.4.1.Final.jar
说明
上面说要将我们用到的jar替换resin的,那么如何找到我们希望的jar包呢?
进入 resin/webapps/{项目名}/WEB-INF/lib
,里面有你的项目所有依赖的jar包,就可以找到你所需要的jar包了
其次如果只替换validation-api
而不替换webapp-jars
下的jar包,可能导致明明版本也是对的,但是就是起不来的情况,这种原因多半是api与实现hibernate-validator
没有对上导致的,所以要替换就替换完整
pom修改
上面改外之后,还需要记得修改一下pom配置文件
1 | <dependency> |
3.3 java.lang.NoClassDefFoundError: javax/el/ELManager
再次运行,又提示了一个NoClassDefFoundError
,手动加上
1 | <dependency> |
3.4 中文乱码及小结
启动过程中,可能会遇到各种jar包冲突,缺失,一个简单的原则就是什么冲突干掉什么,缺什么加什么,一直到启动成功为止
正常启动之后,会自动弹出一个网页
出现上面的中文乱码时,可以在配置文件中,强制指定utf-8, 如 application.yml
1 | spring: |
本文中对应的项目实例可以在下面获取
II. 其他
0. 项目
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/230-web-resin
1. 一灰灰Blog
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
- 一灰灰Blog个人博客 https://blog.hhui.top
- 一灰灰Blog-Spring专题博客 http://spring.hhui.top