1. 概述

手动构建复杂项目相当繁琐。使用构建工具能大幅简化这个过程。众所周知,Java 项目的主要构建工具之一是 Maven。Maven 帮助我们标准化应用的构建和部署流程。

本教程将深入探讨:

  • Maven 构件的核心概念
  • Maven 坐标系统的关键元素
  • 依赖管理机制
  • Maven 仓库体系

2. Maven 是什么

Maven 是构建和管理任何 Java 项目的利器,核心功能包括:

  • 构建与编译:自动化代码编译和打包流程
  • 文档与报告:生成项目文档和构建报告
  • 依赖管理:自动下载和管理项目依赖
  • 源码管理:集成版本控制系统
  • 项目更新:处理项目升级和版本控制
  • 部署发布:自动化部署到远程仓库

3. 什么是 Maven 构件

构件(Artifact)是项目生成或使用的可交付元素。在 Maven 术语中,构件是项目构建后的输出产物,可以是以下类型:

  • JAR 包
  • WAR 包
  • 其他可执行文件

每个 Maven 构件包含五个核心标识元素:

  • groupId
  • artifactId
  • version
  • packaging
  • classifier

这些元素统称为 Maven 坐标,用于唯一标识构件。

4. Maven 坐标系统

Maven 坐标是 groupIdartifactIdversion 的组合值,用于精确定位构件。Maven 通过坐标在仓库中查找匹配的组件。

坐标元素中必须定义:

  • groupId(必选)
  • artifactId(必选)
  • version(必选)
  • packaging(可选)
  • classifier(不可直接定义)

以下 pom.xml 展示了典型的 Maven 坐标配置:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.baeldung</groupId>
    <artifactId>org.baeldung.java</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>org.baeldung.java</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.1.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

4.1. groupId 元素

groupId 是项目所属组织的唯一标识符,用于快速组织和查找项目。其命名规则与 Java 包名一致,通常使用项目顶级包名作为 groupId

例如:

  • groupIdorg.apache.commons
  • 对应仓库路径:${repository_home}/org/apache/commons/

4.2. artifactId 元素

artifactId 是项目在组内的唯一标识,默认用作构件的最终名称。命名时建议:

  • 保持简短
  • 使用实际项目名作为前缀
  • 便于快速定位构件

例如:

  • groupIdorg.apache.commons
  • artifactIdcommons-lang3
  • 对应仓库路径:${repository_home}/org/apache/commons/commons-lang3/

4.3. version 元素

version 定义项目的当前版本号,是构件标识的重要组成部分。Maven 支持版本规范和快照(Snapshot)概念。

版本号在仓库中表现为子目录:

  • groupIdorg.apache.commons
  • artifactIdcommons-lang3
  • version3.1.1
  • 对应路径:${repository_home}/org/apache/commons/commons-lang3/3.1.1/

4.4. packaging 元素

packaging 指定项目生成的构件类型,支持的格式包括:

  • JAR
  • WAR
  • EAR
  • ZIP
  • SWC
  • NAR
  • SWF
  • SAR

该元素还决定了构建生命周期中执行的默认目标:

  • JAR 类型执行 jar:jar
  • WAR 类型执行 war:war

4.5. classifier 元素

classifier 用于在相同代码基础上创建不同技术特性的构件。典型场景:

  • 使用不同 Java 编译器构建的 JAR
  • 打包源代码或 JavaDoc
  • 生成二进制文件包

例如:

  • 基础构件:commons-lang3-3.10.jar
  • JavaDoc 构件:commons-lang3-3.10-javadoc.jar
  • 源码构件:commons-lang3-3.10-sources.jar
  • 存储路径:${repository_home}/org/apache/commons/commons-lang3/3.1.0/

5. 发布版 vs 快照版构件

5.1. 发布版构件

发布版(Release)表示版本稳定的构件,可用于:

  • 集成测试
  • 客户验收
  • 预生产环境
  • 正式生产环境

关键特性:

  • 唯一性:同一版本只能部署一次
  • 执行 mvn deploy 后,再次部署相同版本会失败

5.2. 快照版构件

快照版(Snapshot)表示开发中的项目版本。当 version 包含 SNAPSHOT 时:

  • Maven 自动将其转换为 UTC 时间戳
  • 格式示例:1.0-SNAPSHOT1.0-20220219-230800

本质区别:

  • 部署快照版时,实际交付的是代码的时间点快照
  • 每次部署都会生成新的时间戳版本

6. 依赖管理

依赖管理是 Maven 的核心能力,主要解决:

  • 自动识别项目所需依赖
  • 从远程仓库下载到本地仓库
  • 将依赖添加到项目 classpath

依赖管理基于四大概念:

概念 作用说明
仓库 存储构件的中央仓库系统
作用域 指定依赖的使用场景(如编译、测试、运行时)
传递性 自动管理依赖的依赖(依赖树)
继承 子项目可省略版本号,从父 POM 继承依赖版本

pom.xml 中声明依赖的方式:

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.8.4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.3.15</version>
    </dependency>
</dependencies>

7. Maven 仓库

Maven 仓库是存储构建所需依赖和插件的中心化系统。仓库通过以下坐标组织构件:

  • groupId
  • artifactId
  • version
  • packaging

标准仓库目录结构:

${repository_home}/
  ├─ groupId/ (如 org/apache)
  │    ├─ artifactId/ (如 commons-lang3)
  │    │    ├─ version/ (如 3.1.1)
  │    │    │    ├─ 构件文件

示例 POM 配置:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.baeldung</groupId>
    <artifactId>myApp</artifactId>
    <version>1.0.0</version>
</project>

对应仓库路径:

${repository_home}/com/baeldung/myApp/1.0.0/

8. 总结

本文系统解析了 Maven 构件的核心概念:

  • 构件坐标系统:通过 groupId/artifactId/version 实现精确定位
  • 构件类型管理packagingclassifier 实现多样化输出
  • 版本控制策略:发布版与快照版的差异化使用
  • 依赖管理机制:自动化解决传递依赖问题
  • 仓库体系:标准化存储与检索流程

掌握这些核心概念,能显著提升 Java 项目的构建效率和可维护性。


原始标题:What Is an Apache Maven Artifact? | Baeldung