Skip to content

Maven 核心概念

3.1 项目对象模型(POM)

项目对象模型(Project Object Model,简称 POM)是 Maven 的核心概念,它是一个 XML 文件,定义了项目的基本信息、依赖关系、构建过程等。

POM 的基本结构

xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  
  <!-- 项目基本信息 -->
  <groupId>com.example</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  
  <name>My Project</name>
  <description>A sample Maven project</description>
  <url>https://example.com</url>
  
  <!-- 依赖管理 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  
  <!-- 构建配置 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

POM 的继承

Maven 支持 POM 的继承,子项目可以继承父项目的配置。这对于多模块项目非常有用,可以减少重复配置。

xml
<!-- 父 POM -->
<project>
  <groupId>com.example</groupId>
  <artifactId>parent-project</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  
  <properties>
    <java.version>11</java.version>
  </properties>
  
  <dependencies>
    <!-- 共享依赖 -->
  </dependencies>
</project>

<!-- 子 POM -->
<project>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>
  
  <artifactId>child-project</artifactId>
  <!-- 继承父项目的版本和 groupId -->
</project>

3.2 坐标系统

Maven 使用坐标系统来唯一标识一个项目,坐标由以下三个要素组成:

  • groupId:组织或公司的标识符,通常使用反向域名,如 com.example
  • artifactId:项目的标识符,如 my-project
  • version:项目的版本号,如 1.0.0

这三个要素组合起来,形成了 Maven 依赖的唯一标识。例如:

xml
<dependency>
  <groupId>com.example</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0.0</version>
</dependency>

3.3 依赖管理

依赖管理是 Maven 的核心功能之一,它可以自动管理项目的依赖关系,包括依赖的下载、版本控制和冲突解决。

依赖范围

Maven 定义了多种依赖范围,用于控制依赖在不同构建阶段的可见性:

  • compile:默认范围,在编译、测试和运行时都可用
  • provided:只在编译和测试时可用,运行时由容器提供
  • runtime:只在运行时可用,编译时不需要
  • test:只在测试时可用
  • system:与 provided 类似,但需要显式指定依赖的路径
  • import:用于依赖管理,只在 dependencyManagement 中使用

依赖传递

Maven 支持依赖传递,当项目 A 依赖项目 B,项目 B 依赖项目 C 时,项目 A 会自动依赖项目 C。

依赖冲突

当多个依赖引入了相同库的不同版本时,会发生依赖冲突。Maven 会根据依赖的路径长度和声明顺序来解决冲突。

3.4 仓库系统

Maven 使用仓库来存储依赖和构建产物。仓库分为以下几种类型:

本地仓库

本地仓库是位于本地计算机上的仓库,用于存储从远程仓库下载的依赖和本地构建的产物。默认位置是用户主目录下的 .m2/repository 目录。

远程仓库

远程仓库是位于网络上的仓库,用于存储和分发依赖。Maven 有一个中央仓库,位于 https://repo.maven.apache.org/maven2,包含了大多数常用的依赖。

私有仓库

私有仓库是企业内部搭建的仓库,用于存储企业内部的依赖和第三方依赖的缓存。常见的私有仓库解决方案有 Nexus、Artifactory 等。

3.5 生命周期与阶段

Maven 定义了一套标准的构建生命周期,每个生命周期由一系列阶段(phase)组成。Maven 有三套主要的生命周期:

Clean 生命周期

用于清理项目,包含以下阶段:

  • pre-clean:执行清理前的准备工作
  • clean:清理上一次构建的产物
  • post-clean:执行清理后的收尾工作

Default 生命周期

用于构建项目,包含以下主要阶段:

  • validate:验证项目配置是否正确
  • compile:编译项目源代码
  • test:运行测试
  • package:打包项目
  • install:将构建产物安装到本地仓库
  • deploy:将构建产物部署到远程仓库

Site 生命周期

用于生成项目站点,包含以下阶段:

  • pre-site:执行生成站点前的准备工作
  • site:生成项目站点
  • post-site:执行生成站点后的收尾工作
  • site-deploy:部署项目站点

3.6 插件与目标

Maven 的构建过程是由插件来执行的,每个插件可以提供多个目标(goal),每个目标对应一个具体的构建任务。

常用插件

  • maven-compiler-plugin:用于编译 Java 源代码
  • maven-surefire-plugin:用于运行测试
  • maven-jar-plugin:用于创建 JAR 包
  • maven-war-plugin:用于创建 WAR 包
  • maven-deploy-plugin:用于部署构建产物

插件配置

插件可以在 POM 文件中进行配置,例如:

xml
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
      <configuration>
        <source>11</source>
        <target>11</target>
      </configuration>
    </plugin>
  </plugins>
</build>

执行插件目标

可以使用 mvn 命令来执行插件目标,例如:

bash
mvn compiler:compile  # 执行 compiler 插件的 compile 目标
mvn surefire:test      # 执行 surefire 插件的 test 目标

通过了解这些核心概念,您可以更好地理解和使用 Maven 来管理项目。