SpringBoot 打包成 war,并部署到 Tomcat

一、jar 与 war 包的区别

参考来源:spring boot打jar包和打war包的区别作用 - 赖进杰的专栏 - CSDN博客

  • jar 包:直接通过内置 tomcat 运行,不需要额外安装 tomcat。如需修改内置 tomcat 的配置,只需要在SpringBoot 的配置文件中配置。内置 tomcat 没有自己的日志输出,全靠 jar 包应用输出日志。但是比较方便,快速,比较简单。

  • war 包:传统的应用交付方式,需要安装 tomcat,然后放到 webapps 目录下运行 war 包,可以灵活选择tomcat 版本,可以直接修改 tomcat 的配置,有自己的 tomcat 日志输出,可以灵活配置安全策略。相对打成 jar 包来说没那么快速方便。

二、把 SpringBoot 打成 war 包部署到 Tomcat 中

参考来源:三分钟把spring boot打成war包部署到tomcat中 - 掘金

1. 将 SpringBoot 项目打包成 war

修改pom.xml指定打包方式为 war 包: <packaging>war</packaging> 修改 pom.xml 修改 SpringBoot 内置的 tomcat 依赖,指定 scope 为 provided

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

修改成果如下:

img

创建一个初始化文件初始化项目比如:MySpringBootServletInitializer.java 核心代码如下

1
2
3
4
5
6
public class MySpringBootServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MywarApplication.class);
}
}

执行命令 mvn clean install -Dmaven.test.skip=true 将项目打成war包,执行后到target目录可以看到成功的把项目打成了war包

  • 一些注意的点

    • 可以修改最终的war包的名称,比如去掉文件名里的版本号:mywar.war,在pom.xml使用finalName指令可以实现

上述配置如果觉得麻烦,可以直接下载这位作者的代码包,直接下载打包体验(GitHub:neatlife/mywar

2. 把项目的 war 放到 Tomcat 里运行

这里我们以 CentOS 7 为例,进行 Tomcat 配置和部署

  1. 下载 Tomcat9,并解压
1
2
3
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz

tar -zxvf apache-tomcat-9.0.22.tar.gz
  1. 将项目打成 WAR 包放在 Tomcat 的 webapps 目录下

  2. /conf 目录下找到 server.xml 的文件

  3. 在Host标签里边添加 <Context path="" docBase="myproject" reloadable="true" />

1
2
3
4
5
6
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="" docBase="myproject" reloadable="true" />
</Host>

Context 标签内容,注意 path 填空,docBase 为项目名称

  1. 启动 Tomcat,sh bin/startup.sh

  2. 再次访问即可携带项目名称或不带都可以访问到项目。如 localhost:8080/ 或 localhost:8080/myproject

参考来源:Tomcat9部署WAR包访问不带项目名的方式 - h363659487的博客 - CSDN博客