科普版解释(小白友好):
JAR包和WAR包就像是两种不同用途的“工具箱”:
-
JAR包(Java Archive)
- 定位:通用型工具箱
- 用途:装Java程序、代码库或独立应用(比如桌面小工具)
- 特点:自带“发动机”(如Spring Boot内嵌Tomcat),可以直接运行
- 举个栗子:你下载一个
.jar文件,双击就能运行一个游戏,不需要额外安装服务器。
-
WAR包(Web Application Archive)
- 定位:专用型厨房工具箱
- 用途:专门装Web应用(比如网站后台),必须放在“厨房”(如Tomcat服务器)才能用
- 特点:需要外接“煤气灶”(服务器),不能独立运行
- 举个栗子:你把
.war文件丢进Tomcat的“厨房”,才能通过浏览器访问网站。
一句话总结:
- JAR包 = 便携工具箱(自带动力)
- WAR包 = 厨房专用工具箱(依赖外部设备)
专业版解释(开发者视角):
1. 本质区别
| 维度 | JAR包 | WAR包 |
|---|---|---|
| 标准定义 | Java标准打包格式(JSR-277/JSR-294) | Java Web应用标准格式(J2EE规范) |
| 文件结构 | 包含META-INF/MANIFEST.MF(定义主类/依赖) | 包含WEB-INF目录(web.xml/classes/lib等) |
| 运行方式 | 可执行JAR通过java -jar启动(含内嵌服务器) | 需部署到Servlet容器(如Tomcat/Jetty) |
| 适用场景 | 普通Java应用/库/Spring Boot独立应用 | 传统J2EE Web应用(如Spring MVC非Boot项目) |
2. 技术细节对比
-
依赖管理
- JAR:通过
MANIFEST.MF的Class-Path声明依赖路径 - WAR:依赖统一放在
WEB-INF/lib目录,容器自动加载
- JAR:通过
-
资源加载
- JAR:使用
ClassLoader.getResource()加载类路径资源 - WAR:通过ServletContext获取
/WEB-INF/resources下的资源
- JAR:使用
-
部署差异(以Spring Boot为例)
// Spring Boot生成可执行JAR的核心配置 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> <!-- 支持直接./app.jar运行 --> </configuration> </plugin> </plugins> </build>WAR包需额外配置:
// Spring Boot生成WAR需修改启动类 @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
3. 性能与扩展性
-
JAR优势
- 启动速度快(内嵌容器无解压过程)
- 内存占用优化(Spring Boot 2.4+的分层JAR技术)
-
WAR优势
- 支持热部署(修改文件后容器自动重加载)
- 多应用共享容器资源(适合企业级环境)
4. 选择建议
- 用JAR:微服务架构/云原生部署(K8s/Docker)
- 用WAR:遗留系统迁移/需与PHP/.NET应用共享Tomcat
终极结论:
JAR是自给自足的独立应用,WAR是依赖容器的Web模块。现代Spring Boot优先选JAR,传统企业级Web项目可能仍需WAR。