Appearance
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 来管理项目。