记一次SpringBoot 部署到resin容器

记一次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版本,则还是会提示包冲突。

猜你喜欢

转载自blog.csdn.net/piaoslowly/article/details/81743721