菜鸟科技网

jar与war命令如何区分使用?

  1. 核心概念与定义
  2. 结构对比
  3. 创建与部署
  4. 使用场景
  5. 总结与选择

核心概念与定义

JAR (Java Archive)

  • 是什么jar 是 Java 的归档文件,你可以把它想象成一个 .zip 文件,专门用于打包 Java 相关的文件。
  • 主要目的
    1. 打包库:将多个 .class 文件、配置文件(如 .xml, .properties)、资源文件(如图片)等打包成一个文件,方便分发和管理。
    2. 可执行程序:打包成一个可执行的 JAR 文件,包含 Main-Class 属性,用户可以通过 java -jar myapp.jar 直接运行。
    3. 组件库:作为其他项目的依赖库使用。

WAR (Web Application Archive)

  • 是什么war 是 Java Web 应用的归档文件,它是一种特殊格式的 JAR 文件,遵循 Java EE(现在是 Jakarta EE)的规范。
  • 主要目的
    1. 打包 Web 应用:专门用于打包 Web 应用程序,以便部署到 Web 容器(服务器)中运行。
    2. 标准化结构:它强制规定了目录结构,使得 Web 服务器(如 Tomcat, Jetty)能够正确地解析和运行你的应用。

一句话总结WAR 是 JAR 的一个超集,专门为 Web 应用设计,拥有更严格的目录结构规范。

jar与war命令如何区分使用?-图1
(图片来源网络,侵删)

结构对比

这是两者最直观的区别。

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

关键点

jar与war命令如何区分使用?-图2
(图片来源网络,侵删)
  • 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与war命令如何区分使用?-图3
(图片来源网络,侵删)

部署方式

类型 部署方式 运行环境
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

  1. 下载并安装 Tomcat。
  2. 将你的 my-webapp.war 文件复制到 Tomcat 的 webapps 目录下。
  3. 启动 Tomcat。
  4. 访问 http://localhost:8080/my-webapp/ 即可运行你的应用。

使用场景

什么时候使用 JAR?

  1. 开发工具库:当你想将一组通用的工具类打包,供其他开发者使用时。
  2. 命令行应用:开发一个独立的桌面工具或命令行工具。
  3. 微服务后端:在现代微服务架构中,绝大多数后端服务(如 Spring Boot 应用)都被打包成可执行的 Fat JAR(或称 Uber JAR),这种 JAR 包含了所有依赖和内嵌的 Web 服务器,非常方便通过 java -jar 命令启动和部署(部署到 Docker 容器中)。

什么时候使用 WAR?

  1. 传统的 Java Web 应用:如果你正在开发一个标准的 Java Web 应用,并且需要部署到外部的 Tomcat、JBoss 等服务器上。
  2. 需要与现有系统集成:如果你的公司有统一的 Web 服务器管理规范,或者你的应用需要与其他 WAR 应用共享同一个服务器实例。
  3. 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 在传统领域和特定部署需求下仍然不可或缺。

分享:
扫描分享到社交APP
上一篇
下一篇