1. 概述

本文主要介绍 Java 中两种常见的打包格式:JARWAR 的区别。

我们会分别介绍它们的定义和用途,并通过结构、用途、执行方式等维度进行对比,帮助你根据项目需求选择合适的打包方式。

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-INFMETA-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 文件,请参考相关构建工具文档或官方指南。


原始标题:Differences Between JAR and WAR Packaging | Baeldung