• SpringBoot2.x入门:应用打包与启动


    前提

    这篇文章是《SpringBoot2.x入门》专辑的第5篇文章,使用的SpringBoot版本为2.3.1.RELEASEJDK版本为1.8

    这篇文章分析一个偏向于运维方面的内容:SpringBoot应用的打包与启动,分别会分析嵌入式Servlet容器和非嵌入式Servlet容器下的应用打包与启动,Servlet容器以比较常用的Tomcat为例。

    嵌入式Tomcat的打包与启动

    嵌入式Tomcatspring-boot-starter-web这个starter自带,因此不需要改动关于Servlet容器的依赖。新建一个启动类club.throwable.ch4.Ch4Application

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Ch4Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Ch4Application.class, args);
        }
    }
    

    添加一个主配置文件application.properties

    server.port=9094
    spring.application.name=ch4-embedded-tomcat-deploy
    

    然后在项目的pom.xml引入Maven插件spring-boot-maven-plugin

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring.boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    

    然后使用命令mvn clean compile packagemvn cleanmvn compilemvn package的组合命令)打包即可:

    如果编译和打包命令执行成功的话,控制台输出BUILD SUCCESS

    同时项目的target目录下(除了一些编译出来的class文件)会多出了一个Jar包和一个x.jar.original文件:

    而这个Jar文件正是可运行的文件,可以通过命令(确保已经安装JDK并且把JREbin目录添加到系统的Path中)运行:

    java -jar ch4-embedded-tomcat-deploy.jar
    

    控制台输出如下:

    一般情况下Jar的执行命令是:

    java [VM_OPTIONS] -jar 应用名.jar [SPRING_OPTIONS]
    例如:
    java -Xms1g -Xmx2g -jar ch4-embedded-tomcat-deploy.jar --spring.profiles.active=default
    

    上面的命令会导致应用挂起在控制台,只要退出控制台,应用就会被Shutdown。如果在Linux下,可以使用nohup(其实就是no hang up的缩写)命令不挂断地运行Jar应用,例如:

    nohup java -Xms1g -Xmx2g -jar ch4-embedded-tomcat-deploy.jar --spring.profiles.active=default >/dev/null 2>&1 &
    

    非嵌入式Tomcat的打包与启动

    一般情况下,非嵌入式Tomcat需要打包成一个war文件,然后放到外部的Tomcat服务中运行。

    • 首先要移除spring-boot-starter-web依赖中的嵌入式Tomcat相关的依赖,并且引入servlet-api依赖。
    • 还要把打包方式设置为war<packaging>jar</packaging>替换为<packaging>war</packaging>)。
    • 最后还要升级maven-war-plugin插件避免因为缺失web.xml文件导致打包失败。

    这里为了满足兼容性,使用的Tomcat版本最好和spring-boot-starter-web中引用的嵌入式Tomcat的依赖版本完全一致,在SpringBoot:2.3.1.RELEASE中,该版本为9.0.36pom.xml的依赖内容如下:

    <packaging>war</packaging>
    <dependencies>
        <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>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>9.0.36</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>ch3-tomcat-deploy</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.0</version>
            </plugin>
        </plugins>
    </build>
    

    这里其实可以选择不排除spring-boot-starter-tomcat,而是把它的作用域缩小为provided,这样就能避免额外引入servlet-api依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
           <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    

    新建一个启动类club.throwable.ch3.Ch3Application,必须继承SpringBootServletInitializer并且重写configure()方法执行入口类:

    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    public class Ch3Application extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(Ch3Application.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(Ch3Application.class);
        }
    }
    

    然后使用命令mvn clean compile package打包:

    下载Tomcat9.0.36,下载地址是https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.36/bin(因为开发机的系统是64bit的Windows10系统):

    解压Tomcat后,把ch3-tomcat-deploy.war拷贝到webapps目录下,然后使用bin/startup.bat启动Tomcat

    由于application.properties里面管理的端口和服务上下文路径配置会失效,需要从Tomcat的入口访问服务,如http://localhost:8080/ch3-tomcat-deploy/

    小结

    这篇文章分别介绍SpringBootJarWar两种打包和部署方式,其实更推荐Jar包的方式,因为嵌入式容器对于开发和发布而言都会相对简便,而且它是SpringBoot默认的启动方式,该方式下默认就支持静态资源整合到Jar包中,可以直接访问。在前后端分离的大型应用中,相对轻量级可以脱离外部容器直接运行的部署方式明显更加吃香。

    项目仓库:

    (本文完 c-2-d e-a-20200709 1:15 AM)

    技术公众号《Throwable文摘》(id:throwable-doge),不定期推送笔者原创技术文章(绝不抄袭或者转载):

  • 相关阅读:
    appium--5 和app交互一些常用到的方法汇总
    个人笔记--注意事项
    带宽准备
    app-crawler安装
    linux常用命令及一些静态动态库相关知识
    深入拆解Java虚拟机(四)JVM是如何处理异常
    深入拆解Java虚拟机(三)JVM是如何执行方法调用的
    深入拆解Java虚拟机(二)Java虚拟机是如何加载Java类的?
    深入拆解Java虚拟机(一)Java的基本类型
    多线程案例分析(二二)高性能网络应用框架Netty
  • 原文地址:https://www.cnblogs.com/throwable/p/13271588.html
Copyright © 2020-2023  润新知