一、Maven 的概念

1. 什么是 Maven

Maven 是一款基于项目对象模型(POM)的项目管理工具,它主要用于 Java 项目的依赖管理项目构建,能自动化完成编译、测试、打包、部署等流程。

2. 什么是依赖管理

依赖管理是指 Maven 能自动下载、管理项目所需的第三方库(如 Spring、MyBatis),并处理库之间的依赖关系(避免版本冲突)。开发者只需在配置文件中声明依赖,Maven 会自动完成后续的依赖解析和资源获取。

3. 什么是项目构建

项目构建是指 Maven 能自动化执行一系列构建流程,包括:

  • 编译:将 Java 源码编译为字节码。
  • 测试:执行单元测试代码。
  • 打包:将项目打包为 jar、war 等格式。
  • 部署:将打包后的产物部署到服务器或仓库。

4. Maven 的应用场景

  • Java 项目开发:管理依赖、自动化构建。
  • 多模块项目:通过聚合和继承管理复杂项目结构。
  • 持续集成(CI):与 Jenkins 等工具集成,实现自动化构建和测试。

5. 为什么使用 Maven

  • 解决依赖地狱:自动处理依赖的传递和冲突。
  • 标准化项目结构:遵循 “约定优于配置”,项目结构统一,降低学习成本。
  • 自动化构建流程:一键完成编译、测试、打包等操作。
  • 跨环境一致性:确保不同开发环境的构建结果一致。

6. Maven 的模型

Maven 基于三个核心模型运作:

  • 项目对象模型(POM):通过pom.xml描述项目的依赖、插件、构建规则等。
  • 依赖管理模型:通过坐标(GroupId、ArtifactId、Version)唯一标识依赖,自动解析和下载。
  • 构建生命周期模型:定义了编译、测试、打包等一系列构建阶段,每个阶段由插件执行具体任务。

二、Maven 初始

1. Maven 的安装

  • 步骤 1:下载 Maven访问Maven 官网,下载对应系统的二进制包(如apache-maven-3.9.xxx-bin.zip)。

  • 步骤 2:解压并配置环境变量

    • 解压到任意目录(如D:\apache-maven-3.9.x)。
    • 配置系统环境变量MAVEN_HOME为解压目录,将%MAVEN_HOME%\bin添加到Path变量中。
  • 步骤 3:验证安装打开命令行,执行mvn -v,若输出 Maven 版本和 Java 版本信息,则安装成功。

2. Maven 的第一个项目(命令行方式)

通过 Maven 的archetype(项目模板)快速创建 Java 项目:

# 创建一个简单的Java项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  • groupId:组织标识(通常是公司域名倒写)。
  • artifactId:项目标识(项目名称)。
  • 执行后,Maven 会创建标准的项目结构,并自动生成pom.xml和示例代码。

3. Maven 的第二个项目(多模块认知)

为了理解 Maven 的多模块管理,可创建一个包含 “业务模块” 和 “工具模块” 的多模块项目:

# 先创建父项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-multi-module -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
# 进入父项目目录,创建子模块
cd my-multi-module
mvn archetype:generate -DgroupId=com.example -DartifactId=module-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate -DgroupId=com.example -DartifactId=module-util -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

父项目的pom.xml会自动添加子模块的聚合配置,子模块可通过依赖引用其他模块。

4. Maven 仓库配置

Maven 的仓库分为三类:

  • 本地仓库:默认位于C:\Users\用户名\.m2\repository,存储下载的依赖包。
  • 中央仓库:Maven 官方维护的公共仓库,包含绝大多数开源依赖。
  • 私服仓库:企业内部搭建的私有仓库,用于存储内部项目依赖或缓存中央仓库资源。

可通过修改conf/settings.xml配置仓库:

<!-- 配置本地仓库路径 -->
<localRepository>D:\maven-repo</localRepository>

<!-- 配置阿里云镜像(加速中央仓库下载) -->
<mirrors>
    <mirror>
        <id>aliyun-maven</id>
        <name>阿里云Maven镜像</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

5. Idea 整合 Maven 项目

  • 打开 IDEA,进入File → Settings → Build, Execution, Deployment → Build Tools → Maven
  • 配置Maven home path为本地 Maven 安装目录,User settings fileconf/settings.xmlLocal repository为本地仓库路径。
  • 新建项目时,选择 “Maven”,并选择对应的 archetype(如maven-archetype-quickstart),即可创建 Maven 管理的项目。

6. Maven 项目视图

Maven 项目在 IDEA 中的核心视图:

  • 项目结构:遵循约定的目录结构,src/main/java存放源码,src/main/resources存放资源文件,src/test/java存放测试代码。
  • Maven 面板:位于右侧,可查看项目的依赖、插件,执行构建命令(如cleancompilepackage)。

三、Maven 的进阶

1. pom.xml 文件解析

pom.xml是 Maven 项目的核心配置文件,主要包含以下部分:

  • 项目基本信息groupIdartifactIdversionpackaging(打包方式,如 jar、war)。
  • 依赖配置<dependencies>标签下声明项目依赖。
  • 插件配置<build><plugins>标签下配置构建插件(如编译插件、测试插件)。
  • 仓库配置<repositories>标签下配置自定义仓库。

2. 坐标

Maven 通过 ** 坐标(GroupId + ArtifactId + Version)** 唯一标识一个依赖,示例:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.20</version>
</dependency>
  • groupId:组织标识,如org.springframework
  • artifactId:项目 / 模块标识,如spring-core
  • version:版本号,如5.3.20

3. 依赖

依赖是指项目依赖的第三方库或模块,Maven 通过坐标自动管理依赖的下载和传递。

示例:添加 MyBatis 依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
</dependency>

4. 依赖范围

依赖范围(<scope>)定义了依赖在哪些构建阶段有效,常见范围:

范围 编译期 测试期 运行期 说明
compile ✔️ ✔️ ✔️ 默认范围,编译、测试、运行都有效(如 Spring 核心包)
test ✔️ 仅测试期有效(如 JUnit)
provided ✔️ ✔️ 编译、测试有效,运行时由容器提供(如 Servlet API)
runtime ✔️ ✔️ 测试、运行有效,编译时不需要(如 JDBC 驱动)

示例:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

5. 依赖传递和可选依赖

  • 依赖传递:Maven 会自动传递依赖的依赖(如 A 依赖 B,B 依赖 C,则 A 会间接依赖 C)。可通过<exclusions>排除不需要的传递依赖。示例:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>module-a</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.unwanted</groupId>
                <artifactId>unwanted-lib</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 可选依赖:通过<optional>true</optional>标记依赖为可选,不会被传递。示例:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>optional-lib</artifactId>
        <version>1.0.0</version>
        <optional>true</optional>
    </dependency>
    

6. 仓库

除了中央仓库和本地仓库,Maven 还支持私服仓库自定义远程仓库。在pom.xml中配置自定义仓库:

<repositories>
    <repository>
        <id>my-repo</id>
        <name>自定义仓库</name>
        <url>http://localhost:8081/repository/my-repo/</url>
    </repository>
</repositories>

7. 生命周期

Maven 的构建生命周期分为三个核心周期,每个周期包含多个阶段:

  • clean 周期:用于清理项目,包含clean(清理编译产物)等阶段。
  • default 周期:用于构建项目,包含compile(编译)、test(测试)、package(打包)、install(安装到本地仓库)、deploy(部署到远程仓库)等阶段。
  • site 周期:用于生成项目文档,包含site(生成文档)、site-deploy(部署文档)等阶段。

执行命令时,Maven 会执行指定阶段及之前的所有阶段,例如执行mvn package,会依次执行compiletestpackage阶段。

8. Maven 插件使用

Maven 的功能由插件实现,每个插件包含多个目标(Goal),可在pom.xml中配置插件:

示例:配置编译插件,指定 Java 版本

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

示例:执行自定义插件目标

mvn compiler:compile # 执行编译插件的compile目标

9. Maven 的继承和聚合

  • 继承:用于抽取多模块项目的公共配置(如依赖版本、插件配置)。在父项目的pom.xml中配置<parent>,子项目可继承父项目的配置。父项目示例:

    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.3.20</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    子项目示例:

    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>child-project</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
    
  • 聚合:用于将多模块项目整合为一个整体,在父项目的pom.xml中配置<modules>,可一键构建所有子模块。示例:

    <modules>
        <module>module-service</module>
        <module>module-util</module>
    </modules>
    

四、Maven 的私服搭建

1. Maven 私服介绍

Maven 私服是企业内部的私有仓库,主要作用:

  • 存储内部项目的依赖(如公司自研的公共模块)。
  • 缓存中央仓库的依赖,提升下载速度,减少外网依赖。
  • 统一管理依赖版本,避免版本冲突。

主流的 Maven 私服工具是Nexus Repository Manager

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐