Maven 打包方式 JAR WAR POM

Maven 打包方式 JAR WAR POM

我的理解

  • Java 项目打 jar 包
  • JavaWeb 项目打 war 包
  • pom 不打包,用于父工程管理依赖版本和聚合项目模块。

AI 解释

在 Maven 中,<packaging> 标签决定了项目的最终构建产物类型以及默认的构建生命周期。您提到的 JAR、WAR 和 POM 是最核心的三种打包方式,它们分别对应着不同的项目类型和部署场景。以下是这三种打包方式的详细对比与解析:

1. JAR 打包(Java Archive)

  • 默认行为 :如果在 pom.xml 中没有显式声明 <packaging> 标签,Maven 会默认将其视为 JAR 包。
  • 核心特点 :生成一个标准的 .jar 文件,内部仅包含编译后的 .class 字节码文件和项目资源文件,不包含任何第三方依赖。
  • 适用场景
    • 作为普通 Java 工具类库、公共组件,供其他项目作为依赖引入。
    • 作为独立运行的 Java 应用程序(如 Spring Boot 微服务项目,通常会配合 spring-boot-maven-pluginmaven-shade-plugin 打成包含所有依赖的 Fat JAR)。
  • 配置示例<packaging>jar</packaging>

2. WAR 打包(Web Application Archive)

  • 核心特点 :专用于 Java Web 应用程序。生成的 .war 文件除了包含 JAR 包中的类文件和资源外,还必须包含 Web 应用特有的目录结构(如 WEB-INF/web.xml、前端静态资源 HTML/JSP/CSS 等)。
  • 适用场景:传统的 Java Web 项目(如基于 Spring MVC 或 Servlet 的项目)。打包后需要部署到外部的 Servlet 容器(如 Tomcat、Jetty)中运行。
  • 注意事项
    • 必须显式声明打包类型:<packaging>war</packaging>
    • 项目结构必须符合规范,必须包含 src/main/webapp 目录。
    • 对于 Servlet API 等由容器提供的依赖,必须将作用域设置为 <scope>provided</scope>,避免打包时发生冲突。

3. POM 打包(纯 POM 项目)

  • 核心特点 :这种类型的项目本身不包含任何实际的 Java 代码,构建时也不会生成 JAR 或 WAR 等二进制文件。它仅保留 pom.xml 文件。
  • 适用场景
    • 父 POM(Parent POM) :用于定义一组共享的配置、统一的依赖版本(dependencyManagement)和插件设置,子模块可以继承这些配置,避免重复定义。
    • 聚合项目(Aggregator) :用于管理多个子模块。通过在 POM 中声明 <modules> 标签,可以一次性构建和发布多个子模块。
  • 配置示例<packaging>pom</packaging>

📊 核心差异对比总结

维度 POM 打包 JAR 打包 WAR 打包
是否包含代码
生成文件 无(仅 pom.xml) .jar 文件 .war 文件
主要用途 管理依赖版本、聚合多模块 独立 Java 程序、工具类库 Java Web 应用程序
是否包含 Web 资源 是(含 WEB-INF 等)
部署方式 无需部署 直接运行 (java -jar) 或作依赖 部署到 Servlet 容器 (Tomcat等)
适合项目类型 多模块父项目 微服务、命令行工具、基础库 传统 Java Web 应用

需要我帮你整理一份各打包类型对应的常用插件配置示例吗?比如 WAR 的 maven-war-plugin、JAR 的 maven-shade-plugin 等。