Springboot 进行war包部署,以及踩坑历险!!!

使用springboot也很长时间了,一直都是使用内置Tomcat运行项目,最近由于公司架构需要将项目以war包形式发布封装组件,又不想把自己多天的成功重新用spring造一遍,遂有了将springboot打成war包的想法。参考网上各种方法,自己也在坑里挣扎了许久。脱坑后总结一下,供大家参考,也给自己提醒。
首先需要一个能成功运行的springboot项目,这里不在重新搭建,直接用已知项目作为更改。

启动文件修改

springboot默认是使用内部Tomcat启动,如果使用外部Tomcat的话同样存在一个入口的问题,这里我们只需要将启动类继承SpringBootServletInitialize告诉外部Tomcat在这个类下启动(注解并不需要这么多,这里只是为了学习和记录,大家可以参考参考)。

@EnableTransactionManagement // springboot 开启事务的注解
@EnableCaching // 使能缓存
@EnableAsync   //为了使@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync
@SpringBootApplication
public class RestdemoApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(RestdemoApplication.class);
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(RestdemoApplication.class, args);
    }
}

pom文件的修改

首先我们需要将springboot打包方式更改为war

war

springboot 内置了Tomcat,为了防止Java包冲突我们需要排除springboot默认Tomcat依赖,然而Tomcat启动有需要一些sevlet或者el等类去编译,因此还需要依赖spring-boot-starter-tomcat,当然这里的作用域需要设置为provided

        
            org.springframework.boot
            spring-boot-starter-web
            
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            

        
            
        
            org.springframework.boot
            spring-boot-starter-tomcat
            provided
        

接着是添加maven插件


    
    
        
            org.springframework.boot
            spring-boot-maven-plugin
            1.4.2.RELEASE
            
                true
                                  
                com.example.restdemo.RestdemoApplication
            
            
                
                    
                        repackage
                    
                
            
        

        
            org.apache.maven.plugins
            maven-war-plugin
            
                
                false
            
        
    

    

pom文件修改就到这里。

IDEA 配置Tomcat启动

此处省略Tomcat启动....或者直接使用maven命令打包(跳过测试过程)
maven clean package  -Dmaven.test.skip=true 

不知道你们是否正常启动,如果有问题继续看看我踩的坑

踩坑记录

1.启动后无法正常访问
在cmd里面查看我springboot配置的端口8084,使用netstat -ano|findstr "8084",没有找到相关进程。
同样查看Tomcat配置的端口8087,使用
netstat -ano|findstr "8084",看到端口以及被监听,根据进程号可以查看和kill端口。
注意:在application.properties里面配置的端口是springboot内部端口,同外部Tomcat启动的话端口并不是 application.properties的配置端口,而是外部Tomcat所配置的端口。
2.端口问题解决后还是没法访问,于是若若的看了一下Tomcat日志,报错了。。。堆栈日志我就不贴了,告诉大家出现这样的报错
Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager 。什么?我不是已经加入spring-boot-starter-tomcat 相关依赖了吗?这个问题我苦苦在坑里待好几天,终于在网上找到了答案。原因是我的tomcat7提供的el-api 和项目里面的el-api.jar冲突,解决办法也很简单,就是将你IDE(IDEA 或eclipse)安装目录下的el-api.jar 替换Tomcat的lib目录下的el-api.jar 或者使用Tomcat8 即可解决问题。
暂时就这么多,终于可以helloword了,如果大家还有什么坑可以贴出来一起交流交流。

你可能感兴趣的:(Springboot 进行war包部署,以及踩坑历险!!!)