Maven 实战指南
bash mvn -version
若显示 Maven 版本、Java 版本等信息,则安装成功。
#### 2.3 配置本地仓库与镜像
Maven 默认将下载的依赖存储在本地的 `~/.m2/repository` 目录。为加速国内下载,可在 `$MAVEN_HOME/conf/settings.xml`(或用户目录下的 `.m2/settings.xml`)中配置阿里云镜像:
```xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
3. 核心概念
3.1 POM 文件
POM(Project Object Model)是 Maven 工程的灵魂,文件名为 pom.xml。它定义了项目的基本信息、依赖、插件、构建配置等。最小 POM 示例:
<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-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
3.2 坐标
Maven 通过三个字段唯一定位一个构件:
- groupId:组织或公司域名反写,如
org.springframework - artifactId:项目名称或模块名,如
spring-core - version:版本号,如
5.3.23
3.3 依赖管理
在 dependencies 元素中声明项目所需的外部库:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
</dependencies>
Maven 会自动解析并下载该依赖及其传递性依赖。可通过 scope 控制依赖范围(compile, runtime, test, provided),通过 exclusions 排除不需要的传递依赖。
3.4 生命周期与插件
Maven 定义了三个内置生命周期:
- clean:清理项目(删除 target 目录)
- default:核心构建过程(编译、测试、打包、安装、部署等)
- site:生成项目站点文档
每个生命周期由一系列阶段(phase)组成,而真正执行任务的是插件(plugin)的目标(goal)。例如 mvn compile 会调用 maven-compiler-plugin 的 compile 目标。
4. 创建第一个 Maven 项目
4.1 使用原型生成项目
Maven 提供了大量项目模板(archetype),快速生成项目骨架。在终端执行:
mvn archetype:generate -DgroupId=com.example -DartifactId=hello-maven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
执行后会在当前目录生成 hello-maven 文件夹,包含标准的 Maven 项目结构:
hello-maven
├── pom.xml
└── src
├── main
│ └── java
│ └── com/example/App.java
└── test
└── java
└── com/example/AppTest.java
4.2 理解项目结构
src/main/java:主代码src/main/resources:主配置文件(需手动创建)src/test/java:测试代码src/test/resources:测试配置文件target/:构建输出目录
5. 常用命令实战
进入项目根目录,即可执行以下命令:
| 命令 | 功能说明 |
|---|---|
mvn clean |
删除 target 目录 |
mvn compile |
编译主代码 |
mvn test |
运行单元测试 |
mvn package |
打包项目(JAR/WAR),同时执行编译和测试 |
mvn install |
将打包文件安装到本地仓库,供其他项目使用 |
mvn deploy |
将包部署到远程仓库(如 Nexus) |
mvn clean install |
组合命令,先清理再编译、测试、打包、安装 |
提示:可通过
-DskipTests跳过测试,如mvn clean package -DskipTests。
6. 依赖管理进阶
6.1 依赖范围
compile(默认):编译、测试、运行时均可用,参与打包。provided:编译和测试时需要,运行时由容器提供(如 Servlet API)。不参与打包。runtime:编译时不需要,运行时需要(如 JDBC 驱动)。test:仅测试编译和运行时可用。
6.2 依赖传递与冲突解决
- Maven 自动引入直接依赖所依赖的库,形成依赖树。
- 当多个版本冲突时,遵循 最短路径优先 和 先声明优先 原则。
- 使用
mvn dependency:tree查看依赖树,找出冲突。 - 在
pom.xml中通过dependencyManagement统一管理版本,子模块无需再写版本号。
6.3 排除依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
7. 构建配置与插件
7.1 配置编译版本
在 pom.xml 中添加 maven-compiler-plugin 指定 Java 版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
7.2 打包可执行 JAR
借助 maven-assembly-plugin 或 maven-shade-plugin 将依赖一起打包:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
执行 mvn clean package 后,target 目录下会生成 xxx-jar-with-dependencies.jar。
8. 多模块构建
大型项目通常拆分为多个子模块,各模块有自己的 pom.xml,父模块统一管理。
8.1 父模块 POM
<packaging>pom</packaging>
<modules>
<module>order-service</module>
<module>user-service</module>
</modules>
8.2 子模块 POM
指定父模块:
<parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>order-service</artifactId>