Maven #
1. Maven简介 #
Maven是一个基于项目对象模型(POM)的项目管理和构建自动化工具,主要用于Java项目的构建、依赖管理和项目信息管理。
1.1 核心功能 #
- 项目构建:提供标准的构建生命周期,自动化完成编译、测试、打包等过程
- 依赖管理:自动下载和管理项目依赖的第三方库
- 项目信息:提供项目元数据和文档管理
- 插件架构:支持通过插件扩展功能
2. 安装与配置 #
2.1 系统要求 #
- Java JDK 8或更高版本
- 操作系统:Windows、Linux或macOS
2.2 下载与安装 #
- 从Maven官网下载最新版本
- 解压到本地目录
- 配置环境变量:
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生命周期的主要阶段:
- validate:验证项目结构
- compile:编译源代码
- test:运行测试
- package:打包项目
- verify:验证打包结果
- install:安装到本地仓库
- 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. 最佳实践 #
- 使用标准项目结构:遵循Maven的标准目录结构
- 合理使用依赖范围:根据实际需要选择合适的依赖范围
- 版本管理:使用属性统一管理依赖版本
- 避免重复配置:使用父POM共享配置
- 定期更新依赖:保持依赖的最新稳定版本
- 使用.gitignore:忽略target目录和IDE配置文件
- 编写单元测试:使用Maven的测试框架
- 文档化项目:使用site插件生成项目文档
11. 学习资源 #
本文档介绍了Maven的核心概念、常用命令和最佳实践,帮助开发者快速掌握Maven的使用。
最后更新:2026-02-05