1. 概述
本文主要介绍 Java 中两种常见的打包格式:JAR 与 WAR 的区别。
我们会分别介绍它们的定义和用途,并通过结构、用途、执行方式等维度进行对比,帮助你根据项目需求选择合适的打包方式。
2. JAR 打包格式
JAR(Java Archive) 是 Java 提供的一种打包格式,文件扩展名为 .jar
,通常用于打包 Java 类库、资源文件和元数据。
JAR 实际上是一个 ZIP 格式的压缩包,里面包含了编译后的 .class
文件、资源文件(如图片、配置文件)以及元数据(如 MANIFEST 文件)。
✅ 示例结构
META-INF/
MANIFEST.MF
com/
yourcompany/
YourClass.class
META-INF/MANIFEST.MF
:记录打包信息,比如主类(Main-Class)用于生成可执行 JAR。com/yourcompany/YourClass.class
:Java 编译后的类文件。
✅ 如何生成 JAR?
可以通过 jar
命令手动打包,也可以使用 Maven、Gradle 等构建工具自动完成。
例如使用 Maven 生成可执行 JAR:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.yourcompany.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
3. WAR 打包格式
WAR(Web Application Archive) 是用于打包 Web 应用的归档格式,扩展名为 .war
,通常部署在 Servlet 容器(如 Tomcat、Jetty)中运行。
WAR 包含了 Web 应用所需的所有资源:HTML、JSP、静态资源(CSS、JS)、配置文件(web.xml)、Java 类文件、依赖库(JAR)等。
✅ 示例结构
META-INF/
MANIFEST.MF
WEB-INF/
web.xml
classes/
com/
yourcompany/
YourServlet.class
lib/
dependency.jar
jsp/
index.jsp
META-INF/
:与 JAR 类似,包含元数据信息。WEB-INF/
:Web 应用的核心目录,其中:web.xml
:Web 应用的部署描述符。classes/
:存放编译后的 Java 类文件。lib/
:存放依赖的 JAR 包。jsp/
:存放 JSP 页面。
- 静态资源(HTML、图片等)放在
WEB-INF
外部目录下,可以直接通过浏览器访问。
✅ 如何生成 WAR?
同样可以使用 Maven 或 Gradle 构建 WAR 包,例如 Maven 配置如下:
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
4. 主要区别对比
维度 | JAR | WAR |
---|---|---|
✅ 文件扩展名 | .jar |
.war |
✅ 主要用途 | 通用 Java 库、工具类、可执行程序 | Web 应用部署 |
✅ 执行方式 | 可直接通过 java -jar 运行 |
需部署在 Web 容器中运行 |
✅ 目录结构 | 自由定义 | 固定结构,必须包含 WEB-INF 和 META-INF |
✅ 是否支持 Web 资源 | ❌ 不支持 | ✅ 支持 JSP、HTML、CSS、JS 等 |
✅ 是否需要容器 | ❌ 不需要 | ✅ 必须部署在 Servlet 容器中 |
✅ 是否可包含其他 JAR | ✅ 可以 | ✅ 可以,放在 WEB-INF/lib/ 中 |
⚠️ 踩坑提醒
- WAR 包中
WEB-INF
下的内容是受保护的,不能直接通过浏览器访问,否则会返回 403。 - JAR 包如果想可执行,必须在 MANIFEST 中指定 Main-Class,否则运行时会报错。
- Maven 项目打包时,注意
<packaging>
类型是否正确,JAR 和 WAR 不可混用。
5. 总结
对比项 | JAR | WAR |
---|---|---|
本质 | Java 归档包 | Web 应用归档包 |
用途 | 库、工具、可执行程序 | Web 应用部署 |
结构 | 自由 | 固定 |
执行方式 | 命令行直接运行 | 需要 Web 容器 |
是否适合 Web | ❌ | ✅ |
简单粗暴地说:
- 写的是通用类库或命令行工具?选 JAR。
- 开发的是 Web 应用?选 WAR。
两者虽然都基于 ZIP 格式,但用途和使用场景完全不同,选错打包方式可能导致部署失败或功能异常。
如需进一步了解如何使用 Maven 构建 JAR/WAR 包,或者如何配置 MANIFEST 文件,请参考相关构建工具文档或官方指南。