1. 概述
Maven 中的打包类型(packaging type)决定了项目最终构建产物的形式。常见的构建产物包括 jar、war、pom 等可执行或可部署的文件。
Maven 提供了多种默认打包类型,同时也支持自定义打包方式。
本文将深入讲解 Maven 的各种打包类型。首先介绍 Maven 的构建生命周期机制,然后逐个分析不同打包类型的特点和它们对构建过程的影响,最后演示如何自定义打包类型。
2. 默认打包类型
Maven 内置了多种常用的打包类型,包括 jar、war、ear、pom、rar、ejb 和 maven-plugin。
✅ 每种打包类型都对应一个特定的构建生命周期,该生命周期由多个阶段(phase)组成。
不同打包类型在相同阶段可能执行不同的目标(goal)。
比如:
- 对于 jar 项目,package 阶段会执行
maven-jar-plugin:jar
目标 - 对于 war 项目,则是
maven-war-plugin:war
目标
2.1. jar
Java Archive(*.jar*)是最常见的打包格式之一。它将 Java 类、接口、资源文件等打包成一个压缩文件。
下面是 jar 类型项目的默认生命周期绑定:
- resources: resources
- compiler: compile
- resources: testResources
- compiler: testCompile
- surefire: test
- jar: jar
- install: install
- deploy: deploy
定义一个 jar 项目很简单:
<packaging>jar</packaging>
⚠️ 如果未显式指定 <packaging>
,Maven 默认使用 jar。
2.2. war
Web Application Archive(*.war*)用于打包 Web 应用程序,通常包含 Servlet、JSP、HTML、部署描述符(web.xml)等内容。
与 jar 类似,war 的生命周期也基本一致,但 package 阶段执行的是 maven-war-plugin:war
。
<packaging>war</packaging>
💡 jar 和 war 是 Java 社区中使用最广泛的两种打包方式。
其他如 ejb、par、rar 也类似,只是 package 阶段的目标不同:
- ejb:
ejb:*ejb*
- par:
par:*par*
- rar:
rar:*rar*
2.3. ear
Enterprise Archive(*.ear)用于打包整个 J2EE 应用,包含多个模块,如 Web 模块(.war)和 EJB 模块(.jar*)。
ear 是 jar 和 war 的集合体,通常需要部署到应用服务器才能运行。
默认生命周期绑定如下:
- ear: generate-application-xml
- resources: resources
- ear: ear
- install: install
- deploy: deploy
定义方式:
<packaging>ear</packaging>
2.4. pom
pom 是最简单的打包类型,常用于聚合项目(multi-module project)或父项目(parent project)。
✅ 聚合项目用来统一管理多个子模块,每个子模块独立构建。
✅ 父项目通过继承机制共享配置、插件和依赖版本。
由于不包含源码或资源文件,pom 项目的构建生命周期非常简单:
<packaging>pom</packaging>
其生命周期仅包含两个阶段:
- install
- deploy
2.5. maven-plugin
用于开发自定义 Maven 插件。这类项目需要声明为:
<packaging>maven-plugin</packaging>
生命周期与 jar 类似,但有两个特殊阶段:
- plugin: descriptor 绑定到 generate-resources 阶段
- plugin: addPluginArtifactMetadata 添加到 package 阶段
⚠️ 项目必须依赖 maven-plugin-api
才能正常工作。
2.6. ejb
Enterprise JavaBean(*.ejb*)用于构建分布式服务端应用,常见于企业级系统中。
定义方式:
<packaging>ejb</packaging>
生命周期与 jar 类似,package 阶段执行 maven-ejb-plugin:ejb
。
✅ 项目需要引入 maven-ejb-plugin
插件支持。
2.7. rar
Resource Adapter Archive(*.rar*)用于部署资源适配器(如 JCA),常用于连接企业信息系统(EIS)。
定义方式:
<packaging>rar</packaging>
内容包括:
- 一个包含源码的 jar 文件
- 一个部署描述符 ra.xml
生命周期与 jar 类似,但 package 阶段执行 maven-rar-plugin:rar
。
3. 其他打包类型
除了默认支持的类型,Maven 还可以通过插件支持更多打包格式,如:
- msi
- rpm
- tar
- tar.bz2
- tar.gz
- tbz
- zip
3.1. 自定义打包类型
假设我们想将项目打包为 zip 文件,可以通过以下步骤实现:
- 在
src/main/resources/META-INF/plexus
目录下创建components.xml
:
<component>
<role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
<role-hint>zip</role-hint>
<implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
<configuration>
<phases>
<process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
<package>com.baeldung.maven.plugins:maven-zip-plugin:zip</package>
<install>org.apache.maven.plugins:maven-install-plugin:install</install>
<deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
</phases>
</configuration>
</component>
- 在
pom.xml
中引入插件并启用扩展:
<plugins>
<plugin>
<groupId>com.baeldung.maven.plugins</groupId>
<artifactId>maven-zip-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
这样 Maven 就能识别自定义的 zip 打包类型了。
3.2. 第三方插件支持的打包类型
还有一些打包类型来自外部插件,例如:
- nar:用于本地库打包
- swf / swc:用于 Adobe Flash/Flex 项目
这些项目需要额外引入对应的插件和仓库支持。
4. 总结
本文详细介绍了 Maven 的各种打包类型,包括默认支持的 jar、war、ear、pom 等,以及如何自定义打包方式。
掌握这些打包类型有助于更灵活地组织和构建项目,特别是在大型企业项目中,合理使用打包策略可以提升开发和部署效率。
所有示例均可在 Baeldung GitHub 仓库 中找到。