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-plugin或maven-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>标签,可以一次性构建和发布多个子模块。
- 父 POM(Parent POM) :用于定义一组共享的配置、统一的依赖版本(
- 配置示例 :
<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 等。