- 核心概念与定义
- 结构对比
- 创建与部署
- 使用场景
- 总结与选择
核心概念与定义
JAR (Java Archive)
- 是什么:
jar是 Java 的归档文件,你可以把它想象成一个.zip文件,专门用于打包 Java 相关的文件。 - 主要目的:
- 打包库:将多个
.class文件、配置文件(如.xml,.properties)、资源文件(如图片)等打包成一个文件,方便分发和管理。 - 可执行程序:打包成一个可执行的 JAR 文件,包含
Main-Class属性,用户可以通过java -jar myapp.jar直接运行。 - 组件库:作为其他项目的依赖库使用。
- 打包库:将多个
WAR (Web Application Archive)
- 是什么:
war是 Java Web 应用的归档文件,它是一种特殊格式的 JAR 文件,遵循 Java EE(现在是 Jakarta EE)的规范。 - 主要目的:
- 打包 Web 应用:专门用于打包 Web 应用程序,以便部署到 Web 容器(服务器)中运行。
- 标准化结构:它强制规定了目录结构,使得 Web 服务器(如 Tomcat, Jetty)能够正确地解析和运行你的应用。
一句话总结:WAR 是 JAR 的一个超集,专门为 Web 应用设计,拥有更严格的目录结构规范。

结构对比
这是两者最直观的区别。
JAR 文件结构
JAR 文件的结构非常灵活,没有强制性的目录要求,你可以把它看作一个通用的容器。
my-library.jar
├── com/
│ └── example/
│ └── MyLibrary.class
├── META-INF/
│ ├── MANIFEST.MF <-- 包含版本、签名、Main-Class等信息
│ └── ...
├── config.properties
└── logo.png
WAR 文件结构
WAR 文件有固定的、必须遵守的目录结构,这是 Web 容器识别它的关键。
my-webapp.war
├── WEB-INF/ <-- 核心目录,存放应用私有配置和库,客户端无法直接访问
│ ├── web.xml <-- 部署描述符,配置 Servlet, Filter, Listener等 (Servlet 3.0后可选)
│ ├── lib/ <-- 存放项目依赖的 JAR 包,如 my-library.jar
│ └── classes/ <-- 存放编译后的 .class 文件
│ └── com/
│ └── example/
│ └── MyServlet.class
│
├── META-INF/
│ └── MANIFEST.MF
│
├── index.html <-- Web根目录下的文件,可以直接通过URL访问
├── css/
│ └── style.css
└── images/
└── logo.png
关键点:

WEB-INF目录:这是 WAR 文件的“心脏”,里面的内容对客户端(浏览器)是隐藏的,是应用私有的。web.xml:传统 Java Web 应用的“灵魂”,用于配置应用的各项行为,虽然现在基于注解(如@WebServlet)的开发方式越来越流行,使得web.xml变得可选,但理解它的作用仍然很重要。lib目录:用于存放当前 Web 应用所依赖的第三方库,这些库只对当前应用有效,不会与其他应用冲突。- 根目录:
index.html,css/,images/等文件位于WEB-INF之外,它们构成了 Web 应用的公共资源,可以通过 URL 直接访问。
创建与部署
创建命令
两者都使用 jar 命令来创建,但参数略有不同。
创建 JAR
# 基本语法 jar cvf my-library.jar com/ META-INF/ config.properties # 创建可执行 JAR (关键在于 MANIFEST.MF 文件中指定 Main-Class) jar cvfe my-app.jar com.example.MainClass com/ META-INF/ resources/
创建 WAR
创建 WAR 通常不直接使用 jar 命令,而是由构建工具(如 Maven 或 Gradle)自动完成,如果手动创建,命令如下:
# 假设你的项目结构符合 WAR 规范
jar cvf my-webapp.war -C web/ . # -C 表示先切换到web目录,然后打包其下所有内容
# web/ 目录需要包含WEB-INF, index.html等
在 Maven 中,你只需要执行 mvn package,它会自动根据 pom.xml 的配置生成一个 .war 文件。

部署方式
| 类型 | 部署方式 | 运行环境 |
|---|---|---|
| JAR | 直接运行:java -jar my-app.jar作为库引入到其他项目中 |
Java 虚拟机 (JVM),通常是一个内嵌的 Web 服务器(如 Spring Boot 的 Tomcat) |
| WAR | 部署到 Web 容器:将 .war 文件复制到 Web 容器的特定部署目录下 |
外部 Web 容器/应用服务器,如 Apache Tomcat, Jetty, JBoss/WildFly, WebLogic |
示例:部署 WAR 到 Tomcat
- 下载并安装 Tomcat。
- 将你的
my-webapp.war文件复制到 Tomcat 的webapps目录下。 - 启动 Tomcat。
- 访问
http://localhost:8080/my-webapp/即可运行你的应用。
使用场景
什么时候使用 JAR?
- 开发工具库:当你想将一组通用的工具类打包,供其他开发者使用时。
- 命令行应用:开发一个独立的桌面工具或命令行工具。
- 微服务后端:在现代微服务架构中,绝大多数后端服务(如 Spring Boot 应用)都被打包成可执行的 Fat JAR(或称 Uber JAR),这种 JAR 包含了所有依赖和内嵌的 Web 服务器,非常方便通过
java -jar命令启动和部署(部署到 Docker 容器中)。
什么时候使用 WAR?
- 传统的 Java Web 应用:如果你正在开发一个标准的 Java Web 应用,并且需要部署到外部的 Tomcat、JBoss 等服务器上。
- 需要与现有系统集成:如果你的公司有统一的 Web 服务器管理规范,或者你的应用需要与其他 WAR 应用共享同一个服务器实例。
- 对
web.xml有强依赖:如果你的应用配置严重依赖web.xml文件。
总结与选择
| 特性 | JAR (Java Archive) | WAR (Web Application Archive) |
|---|---|---|
| 核心用途 | 通用归档、可执行程序、库 | 专门用于打包 Web 应用 |
| 文件结构 | 灵活,无强制规范 | 严格,必须包含 WEB-INF 目录 |
| 部署方式 | java -jar 运行;作为库 |
部署到外部 Web 容器 (Tomcat等) |
| 运行环境 | JVM (通常内嵌服务器) | 外部 Web 容器/应用服务器 |
| 典型技术 | Java SE, Spring Boot (内嵌Tomcat) | Java EE / Jakarta EE, 传统 Spring MVC |
| 选择场景 | 命令行工具、库、现代微服务 | 传统 Web 应用、需要部署到外部服务器的项目 |
如何选择?
- 如果你在开发一个独立的、自包含的服务,并且希望简化部署流程:选择 JAR,这是目前微服务开发的主流方式,Spring Boot 就是这方面的典型代表。
- 如果你在开发一个标准的 Web 网站,并且需要将其部署到公司指定的 Tomcat 或 JBoss 服务器上:选择 WAR,这在传统的企业级应用开发中非常常见。
JAR 更侧重于“运行”,而 WAR 更侧重于“部署”,随着 Spring Boot 等框架的兴起,JAR 的使用场景变得越来越广泛,但 WAR 在传统领域和特定部署需求下仍然不可或缺。
