1. 概述

Maven 中的打包类型(packaging type)决定了项目最终构建产物的形式。常见的构建产物包括 jarwarpom 等可执行或可部署的文件。

Maven 提供了多种默认打包类型,同时也支持自定义打包方式。

本文将深入讲解 Maven 的各种打包类型。首先介绍 Maven 的构建生命周期机制,然后逐个分析不同打包类型的特点和它们对构建过程的影响,最后演示如何自定义打包类型。

2. 默认打包类型

Maven 内置了多种常用的打包类型,包括 jarwarearpomrarejbmaven-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>

💡 jarwar 是 Java 社区中使用最广泛的两种打包方式。

其他如 ejbparrar 也类似,只是 package 阶段的目标不同:

  • ejb: ejb:*ejb*
  • par: par:*par*
  • rar: rar:*rar*

2.3. ear

Enterprise Archive(*.ear)用于打包整个 J2EE 应用,包含多个模块,如 Web 模块(.war)和 EJB 模块(.jar*)。

earjarwar 的集合体,通常需要部署到应用服务器才能运行。

默认生命周期绑定如下:

  • 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 文件,可以通过以下步骤实现:

  1. 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>
  1. 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 的各种打包类型,包括默认支持的 jarwarearpom 等,以及如何自定义打包方式。

掌握这些打包类型有助于更灵活地组织和构建项目,特别是在大型企业项目中,合理使用打包策略可以提升开发和部署效率。

所有示例均可在 Baeldung GitHub 仓库 中找到。


原始标题:Maven Packaging Types | Baeldung