前言

最近遇到一个老项目,是springmvc前后不分离的经典webapp工程,需要嵌入到SpringBoot框架中。整合的过程可以说是困难重重,很多地方还要多做一些处理工作才能将两者兼容。此处说一下项目中遇到的一个打包问题。我们都知道,SpringBoot内嵌了web容器(tomcat、jetty等)默认是打成jar包,直接运行,不需要外部的Tomcat容器。

​ 然而本项目打包成jar之后,启动报错了。原因是老项目中的wabacus框架年代久远,长期没有维护,不支持读取jar内的文件(技术上其实可以读取到),而我的项目本身就是打包成的jar,以jar 的方式运行,导致启动失败。

​ 委曲求全,新项目还是打成war包,放在外置的Tomcat容器中运行。

开发步骤

  1. 调整pom文件

    ​ 项目maven的打包方式由jar改为war

    <packaging>war</packaging>

  2. pom中添加Tomcat依赖

    <dependency>
         <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
      </dependency>
    
  3. 设置,打包后的项目访问名称,在build节点里设置文件名

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            ...
        </plugins>
    </build>
    
  4. 更改SpringBoot启动类

    ​ 由于我们需要使用外部Tomcat服务器部署war包,所以不能使用创建项目的application.java 这个main方法了,需要重写一个类似于 web.xml 文件配置的方式来启动 Spring 应用上下文,此时我们需要声明一个类,这个类的作用与在 web.xml 中配置负责初始化 Spring 应用上下文的监听器作用类似。

    ​ 我本人是直接将SpringBoot启动类继承SpringBootServletInitializer的方式来进行配置的。最重要的步骤就是重写SpringBootServletInitializer类的configure方法。

    ```
    @SpringBootApplication
    @ServletComponentScan
    public class IdaApplication extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
       return builder.sources(IdaApplication.class);
   }

   @Override
   public void onStartup(ServletContext servletContext) throws ServletException {
       servletContext.setInitParameter("configpath", "classpath{/reportconfig}");
       super.onStartup(servletContext);
   }

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

}
```

至此,可以运行mvn clean package ,将打包好的war文件放到Tomcat容器中运行。