一、Maven简介

Apache Maven 是一个强大的项目管理和构建自动化工具,主要用于 Java 项目。但它同样适用于 C#、Ruby、Scala 等其他语言的项目。它的核心功能基于 项目对象模型 (Project Object Model, POM) 的概念,通过一个名为 pom.xml 的文件来管理项目的构建、报告和文档。
您可以把它想象成一个非常智能、全自动的项目管家。你只需要告诉它项目的“蓝图”(pom.xml)和最终想要的产品(例如一个可运行的 JAR 包),它就会自动完成下载库文件、编译代码、运行测试、打包部署等一系列繁琐的工作。
总的来说,Maven 解决了软件构建的两方面问题:
- 一是软件是如何构建的。
- 二是软件的依赖关系。
1.Maven 的主要功能和优势
| 功能 | 说明 |
|---|---|
| 依赖管理 | 自动下载和管理 .jar 文件,避免手动管理依赖 |
| 标准化构建流程 | 提供 clean、compile、test、package 等标准生命周期 |
| 项目模板(Archetype) | 快速生成项目结构(如 maven-archetype-quickstart) |
| 多模块支持 | 适用于大型项目,可以拆分为多个子模块 |
| 插件扩展 | 支持自定义构建任务(如 maven-compiler-plugin 指定 Java 版本) |
优势:
-
减少配置:约定优于配置,减少
build.xml(Ant)这样的手动配置。 -
依赖自动管理:只需声明依赖,Maven 自动下载并处理冲突。
-
跨平台:基于 Java,可在 Windows、Linux、macOS 上运行。
-
与 IDE 集成:Eclipse、IntelliJ IDEA、VS Code 都支持 Maven。
二、标准项目结构(约定优于配置)
Maven 强制约定了一个标准的目录结构,这样所有 Maven 项目都长一样,开发者无需配置就能立刻理解任何项目。
my-app(项目名)
├── pom.xml # 核心配置文件
├── src
│ ├── main # 主代码目录
│ │ ├── java # Java 源代码
│ │ └── resources # 资源文件(配置文件、图片等)
│ └── test # 测试代码目录
│ ├── java # 测试 Java 源代码
│ └── resources # 测试资源文件
└── target # 构建输出目录(编译后的类文件、打包的jar等,由maven自动生成)
三、Maven仓库
在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是 JAR),它就是放置所有 JAR 文件(WAR,ZIP,POM 等等)的地方。
Maven 仓库类型:
| 仓库类型 | 存储位置 | 作用 |
|---|---|---|
| 本地仓库 | 默认用户目录下的.m2/repository | 缓存远程下载的依赖 |
| 远程仓库 | 网络服务器 | 提供依赖和插件的集中存储 |
| - 中央仓库 | repo.maven.apache.org | Maven官方维护的默认仓库 |
| - 私服仓库 | 公司内部搭建(如Nexus) | 托管私有依赖,加速构建 |
| - 其他公共仓库 | 如阿里云、JCenter等 | 镜像或补充中央仓库 |
1.本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
2.中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库包含了绝大多数流行的开源 Java 构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的 Java 项目依赖的构件都可以在这里下载到。
3.私服仓库
公司内部通常会搭建私服(如 Nexus, Artifactory),作为远程仓库的代理和缓存,加速下载并存放公司内部的私有组件。
4.Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
工作流程:当你在项目中声明一个依赖时,Maven 会按以下顺序查找:
-
本地仓库
-
→ 私服(如果配置了)
-
→ 中央仓库(或其他配置的公共仓库)
四、setting.xml
Maven 的 settings.xml 是其全局配置文件,用来定制 Maven 的行为,比如设置本地仓库位置、配置远程仓库镜像、管理认证信息等。它与项目级别的 pom.xml 协作,但关注的是构建环境本身及用户特定的设置。
1.settings.xml 的位置与优先级
settings.xml 文件通常存在于两个位置:
-
全局配置:位于 Maven 安装目录的
conf文件夹下(如$M2_HOME/conf/settings.xml)。此处的配置对本机所有使用该 Maven 的用户都生效。 -
用户配置:位于用户目录下的
.m2文件夹中(如~/.m2/settings.xml)。此处的配置仅对当前用户生效,并且优先级高于全局配置。
如果两个文件同时存在,配置内容会被合并,但冲突时用户配置会覆盖全局配置。Maven 实际的配置优先级从高到低是:
pom.xml > 用户 settings (~/.m2/settings.xml) > 全局 settings ($M2_HOME/conf/settings.xml)
2.settings.xml元素详解
2.1 根标签 <settings>
整个配置文件的根节点,定义了 Maven 配置的命名空间和 XML schema 约束,确保配置格式的合法性。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
</settings>
2.2 localRepository
指定本地仓库的路径,Maven 在此存储下载的依赖。未设置时默认为 ~/.m2/repository
<localRepository>D:\Java\Javaweb\develop\apache-maven-3.6.1\mvn-repo</localRepository>
2.3 <mirrors> 与 <mirror>:镜像配置
用于定义远程仓库的镜像,加速依赖下载或指定私有仓库。
<mirror>
<!-- 该镜像的唯一标识符。id 用来区分不同的 mirror 元素。 -->
<id>alimaven</id>
<!-- 镜像作用范围 -->
<mirrorOf>central</mirrorOf>
<!-- 镜像名称 -->
<name>aliyun maven</name>
<!-- 该镜像的 URL。构建系统会优先考虑使用该 URL,而非使用默认的服务器 URL。 -->
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
2.4 <servers> 与 <server>:仓库认证配置
用于存储需要权限验证的仓库的账号密码,避免在 pom.xml 中明文暴露敏感信息。当 Maven 访问 id 匹配的仓库时,会自动使用这里的账号密码进行身份验证。
<servers>
<server>
<id>maven-public</id> <!-- 仓库唯一标识(需与仓库配置中的 id 一致) -->
<username>admin</username> <!-- 登录用户名 -->
<password>1234</password> <!-- 登录密码 -->
</server>
<!-- 其他 server 配置类似,对应不同仓库的认证 -->
</servers>
2.5 <profiles> 与 <profile>:环境配置集
用于定义一组可切换的配置(如仓库、JDK 版本等),可通过激活指定 profile 生效。
<profiles>
<profile>
<id>nexus</id> <!-- profile 唯一标识 -->
<repositories> <!-- 项目依赖仓库配置 -->
<repository>
<id>maven-public</id> <!-- 仓库标识(需与 servers 中 server 的 id 对应) -->
<url>http://192.168.101.206:8080/repository/maven-public/</url> <!-- 仓库地址(企业私服) -->
<releases><enabled>true</enabled></releases> <!-- 允许下载正式版依赖 -->
<snapshots><enabled>true</enabled></snapshots> <!-- 允许下载快照版依赖 -->
</repository>
<!-- 其他仓库配置类似 -->
</repositories>
<pluginRepositories> <!-- 插件仓库配置(Maven 插件的下载地址) -->
<!-- 配置逻辑与 repositories 一致,用于指定插件的下载来源 -->
</pluginRepositories>
</profile>
</profiles>
2.6 <activeProfiles>:激活 profiles
指定哪些 profile 生效(可以同时激活多个)。
<activeProfiles>
<activeProfile>nexus</activeProfile> <!-- 激活企业私服配置 -->
<activeProfile>edas.oss.repo</activeProfile> <!-- 激活阿里云 EDAS 仓库配置 -->
</activeProfiles>
五、Maven生命周期
Maven的生命周期就是对所有的构建过程进行统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署等几乎所有的构建步骤。
Maven 构建生命周期定义了一个项目构建跟发布的过程,包含三个标准生命周期:
- clean:清理项目
- default(或 build):核心构建流程
- site:生成项目文档
1、Clean 生命周期:
- clean:删除目标目录中的编译输出文件。这通常是在构建之前执行的,以确保项目从一个干净的状态开始。
2、Default 生命周期(也称为 Build 生命周期):
- validate:验证项目的正确性,例如检查项目的版本是否正确。
- compile:编译项目的源代码。
- test:运行项目的单元测试。
- package:将编译后的代码打包成可分发的格式,例如 JAR 或 WAR。
- verify:对项目进行额外的检查以确保质量。
- install:将项目的构建结果安装到本地 Maven 仓库中,以供其他项目使用。
- deploy:将项目的构建结果复制到远程仓库,以供其他开发人员或团队使用。
3、Site 生命周期:
- site:生成项目文档和站点信息。
- deploy-site:将生成的站点信息发布到远程服务器,以便共享项目文档。
六、Maven 插件
Maven 插件是扩展 Maven 功能的可执行组件,每个插件包含一个或多个目标(goals),用于执行特定任务(如编译、测试、打包等)。
插件与生命周期的关系:
-
生命周期(Lifecycle):定义构建阶段(phase)的顺序
-
插件(Plugin):提供具体实现(goal)来完成这些阶段的任务
每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。
我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。
所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。
七、Maven POM
POM ( Project Object Model,项目对象模型 ) 是 Maven 的核心配置文件,采用 XML 格式,默认命名为 pom.xml。
POM 是 Maven 工程的基本工作单元,是一个 XML 文件,它定义了项目的基本信息(groupId, artifactId, version,即坐标)、依赖项、插件、构建规则、父项目、环境设置等。
所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。
| 节点 | 描述 |
|---|---|
| project | 工程的根标签。 |
| modelVersion | 模型版本需要设置为 4.0。 |
| groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。 |
| artifactId | 这是工程的标识。它通常是工程的名称。 |
| version |
这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。 |
1.POM 文件基本结构
<project>
<!-- 1. 基础信息 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.hl</groupId>
<artifactId>app</artifactId>
<version>1.0.0</version>
<!-- 2. 元信息 -->
<name>My Application</name>
<description>A demo project</description>
<!-- 3. 依赖管理 -->
<dependencies>...</dependencies>
<!-- 4. 构建配置 -->
<build>...</build>
</project>
2.项目坐标(必须):
| 元素 | 说明 | 示例 |
|---|---|---|
modelVersion | POM 模型版本(固定 4.0.0) | <modelVersion>4.0.0</modelVersion> |
groupId | 组织/公司标识(反向域名) | <groupId>com.example</groupId> |
artifactId | 项目名称 | <artifactId>my-app</artifactId> |
version | 项目版本 | <version>1.0.0</version> |
packaging | 打包类型(jar/war/pom) | <packaging>jar</packaging> |
3.元信息(可选):
| 元素 | 说明 |
|---|---|
name | 项目名称(显示用) |
description | 项目描述 |
url | 项目主页 |
licenses | 许可证信息 |
organization | 组织信息 |
4.依赖管理
POM文件中可以定义项目的依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
| 元素 | 说明 |
|---|---|
groupId | 依赖的组织标识 |
artifactId | 依赖的项目名 |
version | 依赖的版本 |
scope | 依赖作用域(compile/test/provided/runtime) |
optional | 是否可选依赖(默认 false) |
5.插件管理
POM 文件中也可以定义构建过程中的插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
常用插件:
-
maven-compiler-plugin:指定 Java 版本 -
maven-surefire-plugin:控制测试执行 -
maven-jar-plugin:定制 JAR 包
6.其他常用元素
6.1 properties: 定义项目中的一些属性变量。
用于定义变量,避免重复:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
在依赖中引用:
<version>${java.version}</version>
6.2 dependencyManagement: 用于管理依赖的版本,特别是在多模块项目中。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
</dependencyManagement>
6.3 继承和聚合
继承: 通过 parent 元素,一个POM文件可以继承另一个POM文件的配置:
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
聚合: 通过 modules 元素,一个 POM 文件可以管理多个子模块:
<modules>
<module>module1</module>
<module>module2</module>
</modules>
6.4 repositories: 仓库配置。
指定远程仓库:
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
八、Maven 引入外部依赖
如果我们需要引入第三方库文件到项目,该怎么操作呢?pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。
要添加依赖项,我们一般是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 lib 文件夹下。

<dependencies>
<dependency>
<groupId>com.hl</groupId>
<artifactId>ecp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/ecp-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
<!-- 用于定义构建后的文件名格式 -->
<build>
<finalName>ecp-${artifactId}-${version}</finalName>
</build>
Maven核心技术详解
5023

被折叠的 条评论
为什么被折叠?



