美文网首页学习
Springboot 进行war包部署,以及踩坑历险!!!

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

作者: 清风徐来水波不清 | 来源:发表于2018-07-04 10:00 被阅读4次

使用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

<packaging>war</packaging>

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

        <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>
            
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

接着是添加maven插件


    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.4.2.RELEASE</version>
            <configuration>
                <fork>true</fork>
                                  <!--  这里是启动类App的位置 -->
                <mainClass>com.example.restdemo.RestdemoApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <!-- 没有web.xml 配置的话, 配置为false-->
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>

    </build>

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包部署,以及踩坑历险!!!

    本文链接:https://www.haomeiwen.com/subject/gfgsuftx.html