Maven 核心指南
大约 3 分钟
一、Maven 简介
Maven 是一个项目管理工具,主要用于 Java 项目的构建、依赖管理和项目信息管理。
1.1 核心作用
- 依赖管理:自动下载 jar 包及其依赖,解决版本冲突(Jar 包地狱)。
- 统一构建:提供标准的编译、测试、打包、发布流程。
- 项目结构标准化:约定优于配置(Convention over Configuration),定义了标准的目录结构。
二、安装与配置
2.1 环境配置
- 下载 Maven 压缩包并解压。
- 配置环境变量
MAVEN_HOME指向解压目录。 - 将
%MAVEN_HOME%\bin添加到PATH中。 - 验证:
mvn -v
2.2 settings.xml 配置
Maven 的配置文件位于 conf/settings.xml(全局)或 ~/.m2/settings.xml(用户级)。
配置阿里云镜像(加速下载):
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
配置本地仓库位置:
<!-- 默认在 ~/.m2/repository -->
<localRepository>D:/maven/repository</localRepository>
三、Maven 核心概念
3.1 坐标 (Coordinates)
Maven 使用 GAV 坐标来唯一标识一个项目或依赖:
- GroupId:组织或公司域名倒序(如
com.alibaba)。 - ArtifactId:项目或模块名称(如
fastjson)。 - Version:版本号(如
1.2.76)。
3.2 POM (Project Object Model)
pom.xml 是 Maven 项目的核心配置文件。
<project>
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标 -->
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式:jar(默认), war, pom -->
<packaging>jar</packaging>
<!-- 属性配置 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖列表 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.3 标准目录结构
my-app
├── pom.xml # 核心配置
└── src
├── main
│ ├── java # 源代码
│ └── resources # 资源文件 (配置文件, xml等)
└── test
├── java # 测试代码
└── resources # 测试资源
四、依赖管理
4.1 依赖范围 (Scope)
通过 <scope> 标签指定依赖的作用范围:
| Scope | 编译 (Compile) | 测试 (Test) | 运行 (Run) | 例子 |
|---|---|---|---|---|
| compile (默认) | √ | √ | √ | Spring-Core, Commons-Lang |
| test | - | √ | - | JUnit |
| provided | √ | √ | - | Servlet-API (由容器提供) |
| runtime | - | √ | √ | JDBC Driver |
| system | √ | √ | - | 本地 jar 包 (不推荐) |
4.2 依赖传递与冲突解决
- 传递性:A 依赖 B,B 依赖 C,则 A 自动拥有 C。
- 冲突原则:
- 路径最近者优先:A -> B -> C(v1) vs A -> D -> C(v2),选 C(v1)。
- 第一声明者优先:路径长度相同时,pom 中先声明的优先。
排除依赖 (Exclusion): 如果不想引入传递下来的某个包,可以使用 <exclusions>。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
五、构建生命周期 (Lifecycle)
Maven 的生命周期是抽象的,实际工作由插件 (Plugins) 完成。主要的生命周期阶段(按顺序执行):
- clean:清理项目(删除 target 目录)。
- validate:验证项目是否正确。
- compile:编译源代码。
- test:运行测试代码。
- package:打包(生成 jar 或 war)。
- verify:检查包的有效性。
- install:安装包到本地仓库(供本地其他项目使用)。
- deploy:部署包到远程仓库(私服)。
常用命令:
mvn clean install:先清理,再构建并安装到本地仓库。mvn package -Dmaven.test.skip=true:打包并跳过测试。mvn dependency:tree:查看依赖树(排查冲突神器)。
六、多模块管理 (Multi-module)
在大型项目中,通常采用父子工程结构。
6.1 父工程 (Parent)
打包方式必须为 pom。主要用于版本管理 (dependencyManagement)。
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
<dependencyManagement>
<!-- 只声明版本,不引入依赖。子模块引入时无需指定版本 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</dependencyManagement>
6.2 子模块 (Module)
声明父工程,继承配置。
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module-a</artifactId>
<dependencies>
<!-- 继承父工程版本,无需写 version -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
七、常用插件配置
7.1 指定 JDK 版本 (Maven Compiler Plugin)
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
7.2 打包可执行 Jar (Spring Boot Maven Plugin)
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
Loading...
