Maven #

1. Maven简介 #

Maven是一个基于项目对象模型(POM)的项目管理和构建自动化工具,主要用于Java项目的构建、依赖管理和项目信息管理。

1.1 核心功能 #

  • 项目构建:提供标准的构建生命周期,自动化完成编译、测试、打包等过程
  • 依赖管理:自动下载和管理项目依赖的第三方库
  • 项目信息:提供项目元数据和文档管理
  • 插件架构:支持通过插件扩展功能

2. 安装与配置 #

2.1 系统要求 #

  • Java JDK 8或更高版本
  • 操作系统:Windows、Linux或macOS

2.2 下载与安装 #

  1. Maven官网下载最新版本
  2. 解压到本地目录
  3. 配置环境变量:
    • MAVEN_HOME:指向Maven安装目录
    • PATH:添加%MAVEN_HOME%/bin(Windows)或$MAVEN_HOME/bin(Linux/macOS)

2.3 验证安装 #

bash
mvn -version

2.4 配置文件 #

  • 全局配置${MAVEN_HOME}/conf/settings.xml
  • 用户配置${user.home}/.m2/settings.xml

3. 基本概念 #

3.1 POM(Project Object Model) #

POM是Maven的核心,是一个XML文件,包含了项目的基本信息和构建配置。

基本结构 #

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-SNAPSHOT</version>  <!-- 项目版本 -->
    <packaging>jar</packaging>  <!-- 打包类型 -->
    <!-- 其他配置 -->
</project>

3.2 坐标系统 #

Maven使用三个坐标唯一标识一个项目或依赖:

  • groupId:组织或公司的唯一标识
  • artifactId:项目或模块的唯一标识
  • version:版本号

3.3 仓库 #

  • 本地仓库${user.home}/.m2/repository,存储下载的依赖
  • 中央仓库:Maven默认的远程仓库,包含大多数开源依赖
  • 私有仓库:企业内部的仓库,如Nexus、Artifactory

3.4 生命周期 #

Maven有三套相互独立的生命周期:

  • clean:清理项目
  • default:构建项目
  • site:生成项目站点

每个生命周期包含多个阶段,如default生命周期的主要阶段:

  1. validate:验证项目结构
  2. compile:编译源代码
  3. test:运行测试
  4. package:打包项目
  5. verify:验证打包结果
  6. install:安装到本地仓库
  7. deploy:部署到远程仓库

4. 常用命令 #

4.1 项目构建 #

bash
# 编译项目
mvn compile

# 运行测试
mvn test

# 打包项目
mvn package

# 安装到本地仓库
mvn install

# 部署到远程仓库
mvn deploy

# 执行完整生命周期
mvn clean install

4.2 依赖管理 #

bash
# 查看依赖树
mvn dependency:tree

# 分析依赖冲突
mvn dependency:analyze

# 下载依赖到本地仓库
mvn dependency:resolve

4.3 项目信息 #

bash
# 查看项目信息
mvn help:describe -Dcmd=compile

# 生成项目站点
mvn site

# 生成依赖报告
mvn project-info-reports:dependencies

4.4 其他常用命令 #

bash
# 创建Maven项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

# 跳过测试
mvn package -DskipTests

# 强制更新依赖
mvn clean install -U

# 指定POM文件
mvn clean install -f pom.xml

5. 项目结构 #

Maven使用标准的项目结构:

text
my-project/
├── src/
│   ├── main/           # 主源代码
│   │   ├── java/       # Java源代码
│   │   ├── resources/  # 资源文件
│   │   └── webapp/     # Web应用资源(如使用war打包)
│   └── test/           # 测试代码
│       ├── java/       # 测试Java源代码
│       └── resources/  # 测试资源文件
├── target/             # 构建输出目录
└── pom.xml             # POM文件

6. 依赖管理 #

6.1 添加依赖 #

pom.xml中添加依赖:

xml
<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

6.2 依赖范围 #

  • compile(默认):编译、测试、运行时都需要
  • provided:编译和测试时需要,运行时由容器提供(如Servlet API)
  • runtime:运行时需要,编译时不需要(如JDBC驱动)
  • test:仅测试时需要(如JUnit)
  • system:类似provided,但需要显式指定jar文件路径
  • import:仅用于dependencyManagement,导入其他POM的依赖管理配置

6.3 依赖冲突解决 #

Maven默认使用"最近获胜"和"第一声明"原则解决依赖冲突。可以通过以下方式显式处理:

xml
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>my-dependency</artifactId>
        <version>2.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>conflicting-group</groupId>
                <artifactId>conflicting-artifact</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

7. 插件使用 #

7.1 内置插件 #

Maven内置了多个常用插件,如:

  • maven-compiler-plugin:编译Java代码
  • maven-surefire-plugin:运行单元测试
  • maven-jar-plugin:创建JAR包
  • maven-war-plugin:创建WAR包

7.2 配置插件 #

pom.xml中配置插件:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
        <!-- 其他插件配置 -->
    </plugins>
</build>

7.3 运行插件目标 #

bash
mvn plugin-groupId:plugin-artifactId:plugin-version:goal

# 简化写法
mvn compiler:compile

8. 高级功能 #

8.1 多模块项目 #

创建父POM和多个子模块:

xml
<!-- 父POM -->
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
    <!-- 共享配置 -->
</project>

8.2 属性配置 #

使用属性简化配置:

xml
<project>
    <properties>
        <java.version>11</java.version>
        <commons-lang3.version>3.12.0</commons-lang3.version>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
    </dependencies>
</project>

8.3 配置文件管理 #

使用profile管理不同环境的配置:

xml
<profiles>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>dev</env>
            <db.url>jdbc:mysql://localhost:3306/dev_db</db.url>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <env>prod</env>
            <db.url>jdbc:mysql://prod-server:3306/prod_db</db.url>
        </properties>
    </profile>
</profiles>

<!-- 使用方式 -->
mvn clean install -Pproduction

9. 常见问题与解决方案 #

9.1 依赖下载失败 #

  • 检查网络连接
  • 检查仓库配置
  • 强制更新依赖:mvn clean install -U
  • 清理本地仓库:删除${user.home}/.m2/repository中对应依赖目录

9.2 编译错误 #

  • 检查Java版本配置
  • 检查依赖冲突
  • 检查源代码语法

9.3 测试失败 #

  • 检查测试代码
  • 检查测试依赖
  • 跳过测试:mvn package -DskipTests

10. 最佳实践 #

  1. 使用标准项目结构:遵循Maven的标准目录结构
  2. 合理使用依赖范围:根据实际需要选择合适的依赖范围
  3. 版本管理:使用属性统一管理依赖版本
  4. 避免重复配置:使用父POM共享配置
  5. 定期更新依赖:保持依赖的最新稳定版本
  6. 使用.gitignore:忽略target目录和IDE配置文件
  7. 编写单元测试:使用Maven的测试框架
  8. 文档化项目:使用site插件生成项目文档

11. 学习资源 #


本文档介绍了Maven的核心概念、常用命令和最佳实践,帮助开发者快速掌握Maven的使用。

最后更新:2026-02-05