使用 Tomcat 部署 Spring Boot 项目
使用 Tomcat 部署 Spring Boot 项目

使用 Tomcat 部署 Spring Boot 项目

Published date
Nov 2, 2019
一般的 Spring Boot 项目打包完是 .jar 文件,已内嵌了 Tomcat 服务器,但是当我们部署到生产环境的时候一般用的是 .war 包,这次我们使用宝塔面板来完成项目的环境搭建和部署。
此教程所使用的环境:
  • Windows 10 Version 1903
  • JDK 8
  • Maven 3.6
  • Spring Boot 2.2
  • CentOS 7.7
  • 宝塔面板 7.0
  • Tomcat 9
  • Nginx 1.17

修改 Maven 打包方式

首先,我们需要构建 .war 包,需要对项目构建进行一些设置,以 Maven 为例,修改 pom.xml修改打包方式为 war,注意最后一行:
<groupId>com.imbytecat</groupId> <artifactId>baotatest</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 打包成 WAR --> <packaging>war</packaging>
加入这一项依赖设置:
<!-- 修改内置 Tomcat 包属性 scope 为 provided --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>

设置 ServletInitializer

在包的根目录新建一个 ServletInitializer 类(比如在我的项目里,与 BaotaApplication 类同级),内容类似如下:
package com.imbytecat.baotatest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BaotaApplication { public static void main(String[] args) { SpringApplication.run(BaotaApplication.class, args); } }

编译 war 包

然后再回到项目根目录(有 pom.xml 的目录),进行编译:
mvn clean package
如果要跳过测试,就输入:
mvn clean package -Dmaven.test.skip=true
编译完成之后就能在 target/ 目录下找到我们的 .war 包,比如我是 baota-0.0.1-SNAPSHOT.war

配置服务器 Tomcat 环境

接下来配置服务器环境,首先宝塔面板的安装不再赘述,到其「软件商店」安装好:
  • Tomcat(必须,要求和本地环境一致,比如我用的是 Spring Boot 2.2,那么就使用 Tomcat 9)
  • Nginx(非必须,可以不用安装,配置反向代理所需)
安装完 Tomcat 后记得放行 8080 端口(Tomcat 默认端口)。再把我们的 .war 包放进 /www/server/tomcat/webapps 目录就会自动解压部署,在同级目录生成同名文件夹(如果没有自动部署就重启一下 Tomcat,另外部署不成功的话可以去 /www/server/tomcat/logs 看看日志文件)。此时再访问 http://example.com:8080/baota-0.0.1-SNAPSHOT/就可以访问我们的应用了。
后面长长的一串似乎并不好看,我们可以将其去掉,有两种方法。
一种是直接将包名改成 ROOT.war,即可。
另一种需要修改配置文件 /www/server/tomcat/conf/server.xml,在 <host>...</host> 标签内插入:
<Context path="" docBase="/www/server/tomcat/webapps/baota-0.0.1-SNAPSHOT" debug="0" reloadable="true" />
或者这样:
<Context path="" docBase="/www/server/tomcat/webapps/baota-0.0.1-SNAPSHOT" debug="0" privileged="true" />
path 属性可以定义访问的路径,比如挂载到 /hello 上,这里我们留空就是根域名。然后再将 Tomcat 配置重载,我们就能在根目录下访问到这个项目了。
还有就是给上传目录配置静态资源映射,比如我这里的 有一个上传目录 /www/uploads ,用户上传的图片都会保存到这个 uploads 文件夹来,那如何在服务器访问这个目录呢?一样,加入:
<Context path="/uploads" docBase="/www/uploads" debug="0" reloadable="true" />

设置 Nginx 反向代理

习惯上还需要配置一下 Nginx 反向代理 Tomcat。去宝塔的“网站”页面里新建一个站点,除了域名保持默认就行了。然后在其“设置”中配置“反向代理”,目标域名就是 Tomcat 的地址,比如 http://127.0.0.1:8080,发送地址用 $host 就可以了,其他保持默认即可,最后访问一下 Nginx 即可成功返回结果。