前提

这篇文章是《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插件``:

<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),不定期推送笔者原创技术文章(绝不抄袭或者转载):

SpringBoot2.x入门:应用打包与启动的更多相关文章

  1. SpringBoot2.x入门:快速创建一个SpringBoot应用

    前提 这篇文章是<SpringBoot2.x入门>专辑的第2篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 常规的套路会建议使用Spring官方提 ...

  2. SpringBoot2.x入门:引入web模块

    前提 这篇文章是<SpringBoot2.x入门>专辑的第3篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要介绍SpringBoot的web模 ...

  3. SpringBoot2.x入门教程:理解配置文件

    前提 这篇文章是<SpringBoot2.x入门>专辑的第4篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要介绍SpringBoot配置文件一 ...

  4. Springboot2.x入门——helloWorld

    Springboot2.x入门--helloWorld 一.简介 1.1 Springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的 ...

  5. spring boot 在eclipse里启动正常,但打包后启动不起来

    现象描述: spring boot 在eclipse里启动正常,但打包后启动不起来. 错误日志如下: D:\Project>java -jar MKKY_CMS.jar . ____ _ __ ...

  6. SpringBoot2.x入门:使用CommandLineRunner钩子接口

    前提 这篇文章是<SpringBoot2.x入门>专辑的第6篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 这篇文章主要简单聊聊钩子接口Comma ...

  7. SpringBoot2.x入门教程:引入jdbc模块与JdbcTemplate简单使用

    这是公众号<Throwable文摘>发布的第23篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...

  8. SpringBoot2.x入门:使用MyBatis

    这是公众号<Throwable文摘>发布的第25篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...

  9. 8. Android加载流程(打包与启动)

    移动安全的学习离不开对Android加载流程的分析,包括Android虚拟机,Android打包,启动流程等... 这篇文章  就对Android的一些基本加载进行学习. Android虚拟机 And ...

随机推荐

  1. 解决Celery 在Windows中搭建和使用的版本

    官网:http://docs.celeryproject.org/en/latest/faq.html#does-celery-support-windows 描述如下:表示Celery 4.0版本以 ...

  2. @atcoder - ARC092F@ Two Faced Edges

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个有向图,对每条边都做一次询问: 翻转这条边后,对原图的强 ...

  3. PyQt5 FileDialog的使用例子

    加载***.ui文件可以使用: loadUi('main_window.ui', self) self.btnFileChoose.clicked.connect(self.getFolderName ...

  4. excel如何快速计算日期对应的生肖?

      是否可以根据日期统计出生肖? 牛闪闪想应该可以吧!结果搜到了一个巨牛无比的公式. =MID("猴鸡狗猪鼠牛虎兔龙蛇马羊",MOD(YEAR(B2),12)+1,1), 利用年份 ...

  5. 用turtle画蛇

    import turtle def drawSnake(rad,angle,len,nackrad): for i in range(len): turtle.circle(rad,angle) #画 ...

  6. (八)跑完用例后通过maven发送邮件

    邮件类: package config; import com.sun.mail.util.MailSSLSocketFactory; import org.apache.log4j.Logger; ...

  7. maven配置错误之Unable to import maven project: See logs for details

    很多朋友在初次使用maven时,都会出现这个问题. 一加载maven项目,即会报出Unable to import maven project这样的错误,哪怕是新的maven项目也不例外. 我查阅了很 ...

  8. 006.OpenShift持久性存储

    一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...

  9. elk3

    视频来自: bootstrap.memory_lock要设置为true,默认使用物理内存 mini_mum_nodes:1表示es集群中最小的matser节点数目,默认就是1,当es集群数目较少的时候 ...

  10. Linux软件服务管理

    学习该课程之前先学习linux的软件安装管理 1.linux的运行级别有下面几种类型 在后面的服务启动管理之中会被使用到 [root@weiyuan httpd-2.4.20]# runlevel N ...