Maven--打包方式详解 (pom、war、jar)

一、Maven 打包方式(Packaging)简介

在 Maven 的 pom.xml 中,<packaging> 标签定义了项目最终生成的打包类型,常见的有:

  • pom

  • jar

  • war

每种打包方式对应不同的项目类型和部署方式,适合不同的应用场景。


二、三种打包类型的定义和区别

类型 定义 作用/用途 生成文件示例
pom 纯POM项目,没有实际代码,仅作为父项目或聚合项目。 用于管理依赖和模块聚合,做多模块项目的父项目 仅生成 pom.xml,不生成jar或war
jar Java可执行或库的标准包,包含.class文件和依赖资源。 Java应用程序或库,适合命令行程序、微服务等 生成 .jar 文件
war Web应用打包格式,包含Web资源(JSP、HTML、WEB-INF等) 用于部署到Servlet容器(如Tomcat、Jetty) 生成 .war 文件

三、详细说明与特点

1. pom 包

  • 特点

    • 不包含任何编译代码。

    • 主要用于管理项目依赖版本、插件版本。

    • 通常作为多模块项目的父模块。

    • 方便统一管理多个子模块。

  • 典型场景

    • 大型项目拆分成多个子模块(比如:service、web、dao、common等),父模块使用pom类型。
  • 示例

    <packaging>pom</packaging>

  • 使用场景示例

某公司有一个大型系统,拆分为多个模块:

  • project-parent(pom包,管理依赖和插件版本)

  • project-service(jar包,业务逻辑)

  • project-web(war包,前端Web应用)

project-parent中定义所有公共依赖版本,子模块继承。


2. jar 包

  • 特点

    • Java标准的可执行或库包。

    • 包含.class字节码文件和资源文件。

    • 适合独立运行的Java程序或者Java库。

    • 可作为其他项目的依赖。

  • 典型场景

    • 后端微服务项目,Spring Boot项目默认打包成jar。

    • 工具类库、通用组件、公共API库。

  • 示例

    <packaging>jar</packaging>

  • 使用场景示例

一个基于Spring Boot的REST服务,打包成jar,直接用java -jar app.jar启动。


3. war 包

  • 特点

    • Web应用专用打包格式。

    • 包含Web资源(HTML、JSP、JS、CSS、WEB-INF目录等)。

    • 需要部署到Servlet容器中(如Tomcat、Jetty、WildFly)。

    • 传统Java Web项目使用war包。

  • 典型场景

    • 传统Java EE Web项目。

    • 需要部署到外部应用服务器的Web应用。

    • Spring MVC、JSP、Servlet等Web项目。

  • 示例

    <packaging>war</packaging>

  • 使用场景示例

一个基于Spring MVC的Web项目,生成war包后部署到Tomcat服务器。


四、总结对比表

维度 pom jar war
是否包含代码
主要用途 管理依赖和聚合模块 可执行Java程序或类库 Java Web应用
生成文件 pom.xml .jar .war
部署方式 无需部署 直接运行或依赖 部署到Servlet容器(Tomcat等)
适合项目类型 多模块父项目 微服务、工具库 传统Web应用
是否包含Web资源

五、额外说明

  • Spring Boot 项目

    默认打包为jar,自带内嵌Tomcat,直接可执行。

    也可以配置为war,部署到外部Tomcat,但需做一些额外配置。

  • 多模块项目中的pom

    方便统一管理依赖版本,子模块可以是jar或war。


六、实际应用场景举例

项目类型 打包方式 说明
工具类库 jar 只包含Java代码和资源,供其他项目引用
单体Web应用 war 传统Servlet容器部署,包含JSP、静态资源等
Spring Boot微服务 jar 自带内嵌容器,独立启动,微服务架构典型选择
多模块项目管理 pom 父项目统一管理多个模块依赖和版本,子模块可为jar或war

七、总结

关键点 建议
你只需管理依赖和聚合模块时,选pom 作为多模块项目的父POM
你开发的是普通Java程序或库时,选jar 包含.class文件,可运行或依赖使用
你开发的是Web应用时,选war 需要部署到外部Web容器的Java Web项目