SpringBoot项目,jar包和war包有何区别?war包修改事项
发布于 作者:苏南大叔 来源:程序如此灵动~
默认情况下,springboot的项目,都是会打包成jar包,和war包相比较而已,最明显的好处就是有一定的加密作用。其次来说,就是jar包默认集成tomcat,部署方便。那么,springboot项目打包成jar包,就没有什么缺点么?

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10,openjdk@23.0.2,IntelliJ IDEA 2024.3.4.1,maven@3.3.2,spring boot@2.5.4,java@17,mysql@5.7.26,MyBatisPlus@3.4.3.4。本文仅仅讨论springboot项目的打包问题,并不涉及普通的java项目,普通java项目可以依然沿用传统war包。
配置项切换
除了在项目初始化的时候,可以进行更改外,已有的项目,也是可以切换这两个jar和war的区别的。修改的配置文件是:项目根目录下的pom.xml,项目是packaging。
修改成jar:
<packaging>jar</packaging>
修改成war:
<packaging>jar</packaging>JAR 包
JAR(Archive)是一种将 Java 应用程序及其依赖打包成单一文件的格式,适合独立运行的应用程序。它会一直保持单一文件状态,除非外部有人对其进行反编译。所以,它是具有加密的自带特性的。
- 独立运行:JAR 包自带嵌入式服务器(如
Tomcat、Jetty),可以通过-jar命令直接运行。 - 轻量化部署:无需依赖外部应用服务器,部署简单。
- Spring Boot 默认支持:Spring Boot 项目默认生成 JAR 包,内置 Tomcat 容器。
运行命令:
java -jar my-springboot-app.jar
WAR包
WAR(Web Application Archive)是一种适用于Web应用的打包格式,通常部署到外部应用服务器(如Tomcat)。它并不会一直保持单一文件状态,服务器有可能会直接把war解包成传统的网站项目结构。所以,这种模式下,加密的效果就不如jar包了。
- 依赖外部服务器:
WAR包需要部署到支持Servlet容器的应用服务器中运行。 - 传统
Web应用支持:适合需要与其他应用共享同一服务器的场景。 - 需要额外配置:
Spring Boot项目需要额外配置以支持WAR打包。
表格对比
| 特性 | JAR | WAR |
|---|---|---|
| 运行方式 | 独立运行,内置服务器 | 依赖外部服务器 |
| 部署复杂度 | 简单,直接运行 | 复杂,需要配置服务器 |
| 适用场景 | 微服务、快速开发 | 单体应用、企业级项目 |
| Spring Boot 支持 | 默认支持 | 需要额外配置 |
- 如果是 微服务架构 或 独立运行的应用,推荐使用 JAR。
- 如果是 传统企业级项目 或需要与其他应用共享服务器,推荐使用 WAR。
springboot war之配置修改
对于springboot项目来说,打包成war包,能顺利运行的话,还需要对代码进行修改。

首先pom.xml需要修改依赖。在WAR模式下,spring-boot-starter-tomcat应该设置为provided,因为Tomcat容器由外部提供。
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>src\main\resources\application.properties:
server.servlet.context-path=/
springboot war之代码修改

src\main\java\com\example\demo\DemoApplication.java:
//...
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
//...
}springboot war之构建
SpingBoot的jar包启动的时候,会显示内置的tomcat是9.0.25版本。所以,打包成war的时候,依然需要外置tomcat@9。否则,跑不起来。

而且为了消除tomcat的webapps配置,带来的目录多一层的问题。这里,对于打包好的war包,需要改名为ROOT.war包才能使用(目的是争夺url的根目录)。将生成的WAR包改名后,放入Tomcat的webapps目录。

启动Tomcat,访问应用。

参考文章:
结语
通过以上分析,可以根据项目需求选择合适的打包方式,从而更高效地完成部署和运行。更多苏南大叔的java相关文章,请点击: