记一次SpringBoot 部署到resin容器
springboot打包war包
第一步:将<packaging>war</packaging>
改为war包
第二步:移除tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--移除嵌入式tomcat插件-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
第三步:上面移除tomcat后,就需要引入servlet包了
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>
第四步:外部容器加载springboot项目配置,继承SpringBootServletInitializer
@SpringBootApplication
public class MiplayMonitorApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MiplayMonitorApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MiplayMonitorApplication.class, args);
}
}
resin容器的问题
resin4.0.40,SpringBoot1.5
springboot部署到resin容器中启动失败的问题?
包冲突关键:validation-api、hibernate-validator、jboss-loggingjar包
解决方案一
resin4.0.40,SpringBoot1.5
在自己的项目中排除冲突的jar包hibernate-validator、jboss-loggingjar,在springboot项目中这:validation-api、hibernate-validator、jboss-loggingjar三个包都是由于引入了starter-web这个里面包含了hibernate-validator,而hibernate-validator包里面又包含了jboss-loggingjar,validation-api。所以只需要在starter-web中排除掉hibernate-validator一个包就可以排除其他了。
第一步:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--移除嵌入式tomcat插件-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
启动项目,发现启动报错,spring初始化错误,就是说且少相应的包。
第二步:
这个时候需要将resin的lib目录下面hibernate-validator、jboss-loggingjar这2个包移动到resin/webapp-jars这个包下面。
重新启动就可以了。
解决方案二
resin4.0.40,SpringBoot1.5
如果项目中使用到了hibernate-validator中的东西来做一些参数校验,按照方案一种的方法,排除掉了,那我们项目怎么办?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--移除嵌入式tomcat插件-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 重新引入hibernate-validator这个包,但是只在编译阶段使用<scope>provided</scope> -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<scope>provided</scope>
</dependency>
从新引入org.hibernate,并加入:provided
科普一下中的参数:
- compile,缺省值,适用于所有阶段,会随着项目一起发布。
- provided,类似compile,期望JDK、容器或使用者会提供这个依赖。
- runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
- test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它
解决方案三,简单
resin4.0.56,SpringBoot1.5
直接升级resin即可。升级到resin-4.0.56最新版本,就没啥问题了。
解压resin56版本会发现,hibernate-validator、jboss-loggingjar这两个包默认就在resin/webapp-jars下面了,而且,springboot里面也不用排除hibernate-validator这个包。按道理现在还是会存在包冲突,但是运行的时候发现没有,我猜测是resin做了一步选择,如果应用程序中有,则使用应用程序中的包,如果应用程序中没有在选择webapp-jars下面的包。
同样的方式,如果是resin-4.0.40版本,则还是会提示包冲突。