在进行SpringBoot项目部署时,你可能会遇到一个典型场景:用 mvn install 打包成jar后,换一台有JDK的机器直接 java -jar 就能运行;而打包成war放进Tomcat,端口号却变成了Tomcat默认的8080,项目路径也加上了应用名。
这究竟是为什么呢?
- 通过jar运行实际上是启动了SpringBoot内置的Tomcat,所以应用配置(如
server.port)生效。
- 将war包部署到外部Tomcat后,内置的Tomcat就不会启用,所有配置(端口、路径)都以外部Tomcat为准。
简单来说,jar包是“自带容器的可执行文件”,而war包是“需要放入容器的Web模块”。
JAR与WAR包的本质区别
为了更好地选择,我们需要理解两者的核心差异:
-
定义与结构:
- WAR:一个完整的Web应用程序模块,必须包含
WEB-INF 目录,其下应有 classes(编译后的类文件)和 lib(依赖JAR包)子目录。它是为Servlet容器(如Tomcat)设计的标准格式。
- JAR:通常是一个包含类文件和资源文件的压缩包。当它声明了
Main-Class 后,可以用 java -jar 命令直接运行。在Spring Boot项目中,它通过内嵌容器实现了自执行。
-
用途与场景:
- WAR:传统Web项目开发完成后,打包部署到独立的Servlet容器中。
- JAR:常用于打包通用类库供其他项目引用。在SpringBoot的微服务理念下,“Use Jar, Not War”成为主流,JAR包因其独立性而成为服务化部署的首选。
-
格式特点 (JAR):
- 安全性:支持数字签名,用于验证代码来源和完整性。
- 高效传输:对于Applet,浏览器可通过一个HTTP事务下载所有相关资源。
- 压缩:采用ZIP格式,节省存储空间。
- 可扩展性:Java扩展框架(Java Extension Framework)使用JAR文件来添加平台功能。
如何将SpringBoot项目打包成JAR
打包成JAR是SpringBoot的默认方式,也是推荐的方式,步骤非常简单。
1. 创建项目
在创建SpringBoot项目时,注意 Packaging 选项默认为 Jar,无需修改。

2. 项目POM文件
一个标准的SpringBoot JAR项目 pom.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
关键:<packaging> 标签默认为 jar,并且必须有 spring-boot-maven-plugin 插件。
3. 执行打包命令
在项目根目录下,打开终端执行Maven命令:
mvn clean package

4. 获取JAR包
命令执行成功后,在 target 目录下即可找到打包生成的 demo-0.0.1-SNAPSHOT.jar 文件。

使用 java -jar target/demo-0.0.1-SNAPSHOT.jar 即可启动应用。
如何将SpringBoot项目打包成WAR
如果你需要将应用部署到已有的Tomcat、WebLogic等Servlet容器,或者需要与一些传统架构集成,则需要打包成WAR。
1. 继承 SpringBootServletInitializer
这是使SpringBoot应用支持WAR部署的关键。你需要创建一个 ServletInitializer 类(或修改主启动类),让它继承 SpringBootServletInitializer。
package com.example.demo;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
// 指向原有的SpringBoot主启动类
return application.sources(DemoApplication.class);
}
}

注意:如果你在创建项目时直接选择了 Packaging 为 War,IDEA或Spring Initializr会自动生成这个类。
2. 修改POM文件
将打包方式改为 war,并修改相关依赖。
<!-- 1. 修改打包方式 -->
<packaging>war</packaging>
<!-- 2. 在依赖中,将内嵌Tomcat的scope设为provided -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除内嵌Tomcat,或将其scope设为provided -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope> <!-- 关键:容器会提供此依赖 -->
</dependency>
<!-- 其他依赖 -->
</dependencies>
关键点:spring-boot-starter-tomcat 的 <scope> 必须设置为 provided,这表示该依赖在打包时会被包含,但在运行时由外部容器(如你安装的Tomcat)提供,从而避免与外部容器的Tomcat发生冲突。
3. 执行打包命令
同样使用Maven命令打包:
mvn clean package

4. 部署WAR包
打包成功后,在 target 目录下会生成 demo-0.0.1-SNAPSHOT.war 文件。将其复制到外部Tomcat的 webapps 目录下,启动Tomcat,Tomcat会自动解压并部署该应用。访问地址将变为 http://服务器IP:Tomcat端口/项目名/你的接口。
总结与选择建议
- JAR包(推荐用于微服务/独立应用):
- 优点:简单、独立、便于容器化(Docker)。应用配置完全自主,部署命令统一(
java -jar)。
- 缺点:每个应用自带容器,可能占用更多内存(多个应用多个容器实例)。
- WAR包(适用于传统环境/特定需求):
- 优点:符合传统Java Web部署习惯,方便在单个Tomcat中管理多个应用。
- 缺点:依赖外部容器,配置受容器影响,部署步骤稍多,不符合云原生趋势。
在当今以云原生和微服务为主流的开发环境中,SpringBoot项目默认并推荐使用JAR包进行打包部署。它简化了部署流程,让应用成为自包含的独立单元,非常适合CI/CD流水线和容器化部署。
然而,在面对遗留系统、企业特定规范或需要使用JSP等传统视图技术(虽然SpringBoot不推荐)的面试场景时,理解并掌握WAR包的打包方式依然是一项有价值的技能。希望这篇对比与实践指南能帮助你根据实际需求做出合适的选择。