SpringBoot2.x入门:应用打包与启动
前提
这篇文章是《SpringBoot2.x入门》专辑的第5篇文章,使用的SpringBoot
版本为2.3.1.RELEASE
,JDK
版本为1.8
。
这篇文章分析一个偏向于运维方面的内容:SpringBoot
应用的打包与启动,分别会分析嵌入式Servlet
容器和非嵌入式Servlet
容器下的应用打包与启动,Servlet
容器以比较常用的Tomcat
为例。
嵌入式Tomcat的打包与启动
嵌入式Tomcat
由spring-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 package
(mvn clean
、mvn compile
和mvn package
的组合命令)打包即可:
如果编译和打包命令执行成功的话,控制台输出BUILD SUCCESS:
同时项目的target
目录下(除了一些编译出来的class
文件)会多出了一个Jar
包和一个x.jar.original
文件:
而这个Jar
文件正是可运行的文件,可以通过命令(确保已经安装JDK
并且把JRE
的bin
目录添加到系统的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.36
,pom.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/
。
小结
这篇文章分别介绍SpringBoot
的Jar
和War
两种打包和部署方式,其实更推荐Jar
包的方式,因为嵌入式容器对于开发和发布而言都会相对简便,而且它是SpringBoot
默认的启动方式,该方式下默认就支持静态资源整合到Jar
包中,可以直接访问。在前后端分离的大型应用中,相对轻量级可以脱离外部容器直接运行的部署方式明显更加吃香。
项目仓库:
(本文完 c-2-d e-a-20200709 1:15 AM)
技术公众号《Throwable文摘》(id:throwable-doge),不定期推送笔者原创技术文章(绝不抄袭或者转载):
SpringBoot2.x入门:应用打包与启动的更多相关文章
- SpringBoot2.x入门:快速创建一个SpringBoot应用
前提 这篇文章是<SpringBoot2.x入门>专辑的第2篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 常规的套路会建议使用Spring官方提 ...
- SpringBoot2.x入门:引入web模块
前提 这篇文章是<SpringBoot2.x入门>专辑的第3篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要介绍SpringBoot的web模 ...
- SpringBoot2.x入门教程:理解配置文件
前提 这篇文章是<SpringBoot2.x入门>专辑的第4篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要介绍SpringBoot配置文件一 ...
- Springboot2.x入门——helloWorld
Springboot2.x入门--helloWorld 一.简介 1.1 Springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的 ...
- spring boot 在eclipse里启动正常,但打包后启动不起来
现象描述: spring boot 在eclipse里启动正常,但打包后启动不起来. 错误日志如下: D:\Project>java -jar MKKY_CMS.jar . ____ _ __ ...
- SpringBoot2.x入门:使用CommandLineRunner钩子接口
前提 这篇文章是<SpringBoot2.x入门>专辑的第6篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 这篇文章主要简单聊聊钩子接口Comma ...
- SpringBoot2.x入门教程:引入jdbc模块与JdbcTemplate简单使用
这是公众号<Throwable文摘>发布的第23篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...
- SpringBoot2.x入门:使用MyBatis
这是公众号<Throwable文摘>发布的第25篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...
- 8. Android加载流程(打包与启动)
移动安全的学习离不开对Android加载流程的分析,包括Android虚拟机,Android打包,启动流程等... 这篇文章 就对Android的一些基本加载进行学习. Android虚拟机 And ...
随机推荐
- (三)linux三剑客之sed
一.sed是什么? 二.sed的工作原理? 三.sed的基本用法? 四.sed的进阶使用? 一.sed是什么? sed 就是一个非交互式流编译器: 交互式:文件缓存.人工编译.全局并行可逆 非交互式: ...
- Grafana6.4.4 + zabbix 4.2
环境简介 OS:Centos 7.4 zabbix:4.2.6 Grafana:6.4.4 一.yum 直接安装的方式 官方推荐有几种安装方式我采用yum 直接安装的方式 官方doc: https:/ ...
- mysql 错误:Table is marked as crashed and should be repaired 解决办法
遇到这个问题几个敲命令轻松搞定 1.首先进入mysql命令台: mysql -u root -p 回车 输入密码 2.查询所有的库 mysql> show databases; 3.进入数据库“ ...
- sublime安装ctags用于追踪函数
1.下载最新的ctags到非中文目录,这里,我们推荐c:\windows\system32,ctags可从http://ctags.sourceforge.net/下载,最后更新是在09年,版本5.8 ...
- Rectangle【思维+模拟】
Rectangle 题目链接(点击) frog has a piece of paper divided into nn rows and mm columns. Today, she would l ...
- 对于Python的GIL锁理解
GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可 ...
- 【环境安装】Docker安装
[环境安装]Docker安装 CentoOS-7 安装步骤: 1.卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-clien ...
- 商城04——门户网站介绍&商城首页搭建&内容系统创建&CMS实现
1. 课程计划 1.门户系统的搭建 2.显示商城首页 3.内容管理系统的实现 a) 内容分类管理 b) 内容管理 2. 门户系统的搭建 2.1. 什么是门户系统 从广义上来说,它将各种应用系 ...
- cb27a_c++_STL_算法_最小值和最大值
cb27a_c++_STL_算法_最小值和最大值min_element(b,e) b--begin(), e--end()min_element(b,e,op). op:函数,函数对象,一元谓词.ma ...
- Java WebService(实战) 简单实例
一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...