美文网首页Spring Boot
SpringBoot:将项目打包成war包运行在外置tomcat

SpringBoot:将项目打包成war包运行在外置tomcat

作者: Renaissance_ | 来源:发表于2021-06-24 10:28 被阅读0次

    Spring Boot内置的tomcat容器,打包成jar包后就可直接运行,配合docker容器化部署,使得项目部署更加简单。但是如果想要Springboot打包成war包,使用外置的web容器部署,应该怎么配置呢。本文将详细介绍,如何将SpringBoot项目打包成war包。

    1. 修改web模块的pom.xml配置

    在笔者的项目中,一个项目被分成多个模块,包括web,biz,common,dao,model等,通过划分模块,使代码结构更加清晰明了。因为主启动类在web模块,所以修改web模块的pom配置。

    项目结构
    • 首先指定打包类型为war包类型
        <artifactId>cms-label-web</artifactId>
        <packaging>war</packaging>
    
    • 移除SpringBoot Starter web中的tomcat依赖
           <!--spring-boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
    • 由于项目还会在tomcat中启动,所以要单独引入tomcat依赖
          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <!--打包的时候可以不用包进去-->
                <scope>provided</scope>
            </dependency>
    
    • 指定打包成war包的名字,然后使用插件maven-war-plugin可以不用创建完成的web目录。
      <build>
            <finalName>ROOT</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <!--可以不用添加web.xml-->
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <plugin>
                    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-deploy-plugin -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <!--deploy 时忽略 model-->
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    2. 修改非web模块的pom.xml配置

    • 指定除web模块外的biz, common, dao, model, web的类型为jar包类型
    <packaging>jar</packaging>
    

    3. 新增ServletInitializer

    • 继承SpringBootServletInitializer,实现configure方法
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    public class ServletInitializer extends SpringBootServletInitializer {
     
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Bootstrap.class);
        }
    
    }
    

    4. 测试

    • 如果使用的是IDEA,右侧边栏的maven选项中,先clean,再package。
    image.png
    • package后,会出现以下内容,说明打包成功
    image.png
    • web模块中编译后的target模块中,出现了ROOT.war包说明打包成功,然后放在tomcat下的webapps目录下,启动tomcat即可。
    image.png
    • IDEA配置tomcat启动,
    image.png image.png image.png

    5. 问题

    • 缺少web.xml
      之前没有完整的配置,导致配置过程中出现了很多问题,比如下面这个问题。报错是缺少web-inf模块,我们用的Springboot项目,已经是前后端分离了,肯定不需要在创建了,应该是有配置可以配置的。
    Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project cms-label-web: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
    
    
    image.png image.png image.png

    解决办法,加上maven-war-plugin插件,这个插件

             <!--可以不用添加web.xml-->
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
    
    • SpringBootServletInitializer的作用

    SpringBootServletInitializer的执行过程,简单来说就是通过SpringApplicationBuilder构建并封装SpringApplication对象,并最终调用SpringApplication的run方法的过程

    spring boot就是为了简化开发的,也就是用注解的方式取代了传统的xml配置。

    SpringBootServletInitializer就是原有的web.xml文件的替代。

    使用了嵌入式Servlet,默认是不支持jsp。

    相关文章

      网友评论

        本文标题:SpringBoot:将项目打包成war包运行在外置tomcat

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