Maven 实战指南

FreeGuideOnline 最新 2026-07-15

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-plugincompile 目标。

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-pluginmaven-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>