《Spring Boot实战指南》
05-04:Spring Boot应用的打包和部署
传统的Web应用进行打包部署时,通常会打成War
包的形式,然后将War
包部署到Tomcat等服务器中,而Spring Boot应用使用的是嵌入式Servlet容器,也就是说,Spring Boot应用默认是以Jar
包形式进行打包部署的,而如果想要使用传统的War包形式进行打包部署,就需要进行一些配置。
1、创建项目
2、Jar包方式打包部署
由于Spring Boot应用中已经嵌入了Tomcat服务器,所以将Spring Boot应用以默认Jar
包形式进行打包部署非常简单和方便。
2.1 Jar包方式打包
1.添加Maven打包插件。在对Spring Boot项目进行打包(包括Jar包和War包)前,需要在项目pom.xml
文件中加入Maven打包插件,Spring Boot为项目打包提供了整合后的Maven打包插件spring-boot-maven-plugin
,可以直接使用。
<build>
<plugins>
<!-- Maven打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.使用IDEA开发工具进行打包。IDEA开发工具除了提供Java开发的便利之外,还提供了非常好的项目打包支持。
(1) 使用IDEA开发工具对Spring Boot项目进行打包时,首先需要单击界面右侧边框视图栏的[Maven]
视图,然后在[Maven]
视图对应的操作窗口中,选择项目目录下[Lifecycle]
目录中的[package]
选项,直接双击就可以进行项目打包了。
(2) 双击[package]选项执行打包后,控制台Run界面中最终显示出了"BUILD SUCCESS"的信息,这说明SpringBoot项目打包成功。
(3) 我们还可以打开IDEA开发工具下项目的target
目录中查看Jar
包的具体存放路径以及名称。
3.Jar包目录结构展示说明。我们可以将Jar
文件解压到当前目录,并在命令提示符下使用tree
命令查看其整个目录结构。
F:\...\SpringBoot0505Deploy\target\springboot0505-deploy-0.0.1-SNAPSHOT>tree
卷 BACK 的文件夹 PATH 列表
卷序列号为 9A79-9E6B
F:.
├─BOOT-INF
│ ├─classes
│ │ ├─com
│ │ │ └─company
│ │ │ └─project
│ │ │ └─controller
│ │ ├─static
│ │ │ └─login
│ │ │ ├─css
│ │ │ ├─img
│ │ │ └─js
│ │ └─templates
│ └─lib
├─META-INF
│ └─maven
│ └─com.company
│ └─springboot0505-deploy
└─org
└─springframework
└─boot
└─loader
├─archive
├─data
├─jar
├─jarmode
└─util
(1) 进入Jar
包存放位置,右击Jar
包名称,使用压缩软件打开并进入到BOOT-INF
目录下,效果如下所示。
(2) 打成的Jar包BOOT-INF
目录下有lib
和classes
两个目录文件。
lib
:lib
目录下对应着所有添加的依赖文件导入的jar
文件;lib
目录下还包括Tomcat相关的jar
文件,并且名字中包含有"tomcat-embed"
字样,这是Spring Boot内嵌的Jar
包形式的Tomcat服务器。classes
:classes
目录下对应着项目打包编译后的所有文件。
2.2 Jar包方式部署
1.先在IDEA开发工具控制台上单击切换到Terminal终端界面,该界面会默认打开项目所在位置;然后输入"java -jar xxx.jar
"指令部署启动对应Jar
包。
cd target
java -jar target\chapter05-0.0.1-SNAPSHOT.jar
2.执行完上述指令后,Terminal终端界面就会启动Spring Boot项目,并显示默认的端口号8080
。执行成功后,就可以访问项目了。
需要说明的是,这里演示的是通过IDEA开发工具提供的Terminal终端界面进行快速的Jar
包部署,除此之外,还可以使用系统自带的终端窗口进行项目Jar
包部署启动。另外,在项目部署过程中,一定要保证执行的xxx.jar
包可以找到并且路径中没有特殊字符(例如空格)。
3、War包方式打包部署
虽然通过Spring Boot内嵌的Tomcat可以直接将项目打成Jar包进行部署,但有时候还需要通过外部的可配置Tomcat进行项目管理,这就需要将项目打成War包。
3.1、War包方式打包
1.声明打包方式为War
包。打开当前项目的pom.xml
文件,使用packaging
标签将Spring Boot项目默认的Jar
包打包方式修改为War
形式。
<description>Demo project for Spring Boot</description>
<!-- 1.将项目打包方式声明为war -->
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
2.声明使用外部Tomcat
服务器。Spring Boot为项目默认提供了内嵌的Tomcat服务器,为了将项目以War
形式进行打包部署,还需要声明使用外部Tomcat服务器。打开当前项目的pom.xml
文件,在依赖文件中将Tomcat
声明为外部提供。
<!-- 2.声明使用外部提供的Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 将服务器声明为外部已提供 -->
<scope>provided</scope>
</dependency>
这样,在项目打包部署时,既可以使用外部配置的
Tormcat
以War
包形式部署,还可以使用内嵌Tomcat
以Jar
包形式部署。
3.提供Spring Boot启动的Servlet初始化器。将Spring Boot项目生成可部署War包的最后一步是提供SpringBootServletInitializer
子类并覆盖其configure()
方法,这样做是利用了Spring框架的Servlet 3.0支持,允许应用程序在Servlet容器启动时可以进行配置。打开项目的主程序启动类Application
,让其继承SpringBootServletInitializer
并实现configure()
方法。
package com.company.project;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@ServletComponentScan // 开启基于注解方式的Servlet组件扫描支持
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
/** 3.程序主类继承SpringBootServletInitializer,并重写configure()方法 */
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4.将项目以War
包形式进行打包了。War包形式的打包方式与Jar
的打包方式完全一样。项目打成War
包后,在IDEA开发工具的target
中查看打成的War
包效果。
3.2、War包方式部署
我们讲解Spring Boot项目以War包形式进行打包部署时,是将打包好的War包文件手动添加到外部安装的Tomcat服务器中进行部署。在实际开发中,还可以先直接在开发工具中配置外部Tomat进行项目部署调试。
1.在Idea中配置一个Tomcat服务器,运行整个项目做测试,以保证独立Tomcat下部署War
包更加顺利。
2.将打包好的War
包复制到Tomcat
安装目录下的webapps
目录中。
3.执行Tomcat安装目录下bin目录中的startup.bat命令启动War包项目。项目启动后,执行效果如下图所示。
4.访问使用外部Tomcat部署的项目时,必须加上项目名称(打成War包后的项目全名)。
项目首页:http://localhost:8888/springboot0505-deploy-war-0.0.1-SNAPSHOT/
登录页面:http://localhost:8888/springboot0505-deploy-war-0.0.1-SNAPSHOT/plat-user/to-login-page
5.手动部署时,如果觉得生成的原War包名称较长,可改简洁名称后部署。
注意:Spring Boot 2.5.4版本默认支持的内嵌式Tomcat为9.0.52版本,将指定版本Spring Boot项目以War
包形式部署到外部Tomcat服务器中时,应尽量使用与Spring Boot版本项目匹配的Tomcat版本进行项目部署,否则在部署过程中可能出现异常。