Maven 概述

简介

Maven 是一个 项目管理与构建自动化工具,主要用于 Java 项目,但也可用于其他语言
Maven 解决了软件构建的两方面问题:

  1. 软件是如何构建的
  2. 软件的依赖关系。

功能

  1. 构建(编译、测试、打包、部署)
  2. 依赖(自动下载和管理第三方库)
  3. 标准化项目结构

特点

  • 约定优于配置:提供标准化的项目结构和构建生命周期
    • /:存放 pom.xml 和所有的子目录
    • /src/main/java:项目的 java 源代码
    • /src/main/resources:项目的资源,比如说 property 文件,springmvc.xml
    • /src/test/java:项目的测试类
    • /src/test/resources:测试用的资源
    • /target:打包输出目录
    • /target/classes:编译输出目录
    • /target/test-classes: 测试编译输出目录
    • ~/.m2/repository:Maven 默认的本地仓库目录位置
  • 依赖管理:自动处理项目依赖关系
  • 插件体系:丰富的插件支持各种构建任务

  • 多模块支持:简化大型项目的管理

Maven 环境配置

  1. 安装 JDK
  2. 下载 maven
    Maven 下载地址:http://maven.apache.org/download.cgi
  3. 设置环境变量
    添加环境变量 MAVEN_HOME
  4. 修改仓库地址
    在 MAVEN_HOME/conf/settings.xml 中修改:
    <localRepository>/path/to/your/repo</localRepository>
  5. 通过 IDEA 创建 maven 项目

编译和运行

  • mvn compile # 编译项目
  • mvn test # 运行测试
  • mvn package # 打包成 .jar 文件
  • java -jar target/my-first-app-1.0-SNAPSHOT.jar # 运行(如果可执行)

Maven 入门指导

通过 IDEA 构建 maven 项目

项目结构解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<project>
<!-- POM 模型版本,固定 4.0.0 -->
<modelVersion>4.0.0</modelVersion>

<!-- 项目坐标(唯一标识) -->
<groupId>com.example</groupId>
<artifactId>my-first-app</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 项目打包方式(默认 jar,也可以是 war、pom 等) -->
<packaging>jar</packaging>

<!-- 项目名称和 URL(可选) -->
<name>my-first-app</name>
<url>http://www.example.com</url>

<!-- 依赖管理 -->
<dependencies>
<!-- JUnit 测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope> <!-- 仅用于测试 -->
</dependency>
</dependencies>
</project>

Maven POM.xml 文件

POM ( Project Object Model,项目对象模型 ) 是 Maven 的核心配置文件,采用 XML 格式,默认命名为 pom.xml。
包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

基本结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<project>
<!-- 1. 基础信息 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

<!-- 2. 元信息 -->
<name>My Application</name>
<description>A demo project</description>
<url>https://example.com</url>

<!-- 3. 依赖管理 -->
<dependencies>...</dependencies>

<!-- 4. 构建配置 -->
<build>...</build>

<!-- 5. 环境配置 -->
<properties>...</properties>
<repositories>...</repositories>
</project>

在创建 POM 之前,我们首先需要描述项目组 (groupId), 项目的唯一 ID。

1
2
3
4
5
6
7
8
9
10
11
12
<project>
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>

<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>

<!-- 版本号 -->
<version>1.0</version>
</project>

继承和聚合

继承:通过 parent 元素,一个 POM 文件可以继承另一个 POM 文件的配置:
聚合:通过 modules 元素,一个 POM 文件可以管理多个子模块

构建生命周期

Maven 构建生命周期定义了一个项目构建跟发布的过程,包含三个标准生命周期:

  • clean:清理项目
  • default(或 build):核心构建流程
  • site:生成项目文档

  1. clean 生命周期
    clean 生命周期负责清理项目的临时文件和目录,常用命令mvn clean
  2. default 生命周期
    default 生命周期是 Maven 最主要的生命周期,包含项目构建和部署的所有核心步骤。

alt text
常用命令:

1
2
3
4
5
mvn compile     # 编译主代码
mvn test # 运行测试
mvn package # 打包(生成target/*.jar)
mvn install # 安装到本地仓库(~/.m2/repository)
mvn deploy # 部署到远程仓库(需配置distributionManagement)
  1. site 生命周期
    site 生命周期用于生成项目站点文档
    常用命令:
1
2
mvn site        # 生成站点(输出在target/site/)
mvn site-deploy # 部署站点(需配置site URL)

构建配置文件

构建配置文件的类型

项目级:定义在项目的 POM 文件 pom.xml 中
用户级:定义在 Maven 的设置 xml 文件中(%USER_HOME%/.m2/settings.xml)
全局:定义在 Maven 全局的设置 xml 文件中(%M2_HOME%/conf/settings.xml)

配置文件激活

maven 常用命令

Maven 命令遵循以下模式:
mvn [选项] [生命周期阶段] [目标]

  • mvn v:检查 maven 版本
  • mvn clean:清理项目
  • mvn compile:编译项目
  • mvn test:测试项目
  • mvn package:打包项目
  • mvn install: 安装到本地
  • mvn deploy:部署到仓库
  • mvn dependency:tree:查看项目依赖树
  • mvn dependency:sources:下载源代码
  • mvn site:生成站点文档

maven 依赖机制

Maven 依赖机制是 Apache Maven 构建工具的核心功能之一,它能够自动下载和管理项目所需的外部库(JAR 文件)及其依赖关系。

依赖生命方式

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

maven 多模块项目

Maven 多模块项目(Multi-module Project)是指一个父项目(parent project)包含多个子模块(submodules)的项目结构。这种结构允许我们将一个大型项目拆分成多个逻辑上独立但又相互关联的模块,每个模块可以单独构建,也可以作为整体一起构建。

  • 代码复用:公共代码可以提取到单独的模块中供其他模块使用
  • 构建效率:只构建发生变化的模块,减少构建时间
  • 依赖管理:统一管理所有模块的依赖关系
  • 版本控制:所有模块使用统一的版本号,便于管理

关键特征:

  • 父 POM:
    必须设置 pom
    通过 管理子模块
  • 子模块:
    通过 继承父 POM
    可以有自己的依赖和构建配置
    示例:

父项目

1
2
3
4
5
6
7
8
9
10
11
12
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>

<modules>
<module>module1</module>
<module>module2</module>
</modules>
</project>

子项目

1
2
3
4
5
6
7
8
9
10
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>module1</artifactId>
</project>

maven 仓库

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven 仓库能帮助我们管理构件(主要是 JAR),它就是放置所有 JAR 文件(WAR,ZIP,POM 等等)的地方。

maven 仓库类型

本地仓库:用户目录下的.m2/repository,缓存远程下载的依赖,运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
远程仓库:网站服务器,提供依赖和插件的集中存储
中央仓库,maven 官方维护的仓库
私服仓库:公司内搭建,托管私有依赖,加速构建

Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
修改 maven 根目录下的 conf 文件夹中的 settings.xml 文件,在 mirrors 节点上,添加内容

1
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

maven 插件

Maven 插件是扩展 Maven 功能的可执行组件,每个插件包含一个或多个目标(goals),用于执行特定任务(如编译、测试、打包等)。