Maven 入门教程

FreeGuideOnline 最新 2026-07-14

bash mvn -version

输出应显示 Maven 版本、Java 版本和操作系统信息。

### 配置本地仓库与镜像

Maven 默认本地仓库位于 `~/.m2/repository`(Windows 在 `C:\Users\用户名\.m2\repository`)。为提高下载速度,推荐配置阿里云镜像。

编辑 `conf/settings.xml`(全局)或 `~/.m2/settings.xml`(用户级),添加:

```xml
<mirrors>
 <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>central</mirrorOf>
     <name>阿里云公共仓库</name>
     <url>https://maven.aliyun.com/repository/public</url>
 </mirror>
</mirrors>

核心概念:坐标与 POM

每个 Maven 项目通过 坐标 唯一标识:

  • groupId:组织或公司域名反写,如 com.example
  • artifactId:项目名称或模块名,如 my-app
  • version:项目版本,如 1.0-SNAPSHOT(快照版本)或 1.0.0(正式版)
  • packaging:打包类型,默认 jar,也可为 warpom

POM(Project Object Model) 是 Maven 项目的核心配置文件,名为 pom.xml,所有构建规则、依赖、插件均在此定义。

第一个 Maven 项目

使用原型(Archetype)快速创建

mvn archetype:generate -DgroupId=com.example -DartifactId=hello-maven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

执行后得到标准目录结构:

hello-maven
├── pom.xml
└── src
    ├── main/java/com/example/App.java
    └── test/java/com/example/AppTest.java

App.java 默认打印 “Hello World!”。

项目目录约定

项目根目录
│   pom.xml
└── src
     ├── main
     │    ├── java         # 应用程序源码
     │    ├── resources    # 配置文件、资源文件
     │    └── webapp       # Web 应用前端资源(如为 war 模块)
     └── test
          ├── java         # 测试源码
          └── resources    # 测试资源
  • target/ 为构建输出目录,编译 class、打包后 jar 等均在此,无需版本控制。

依赖管理

Maven 通过在 pom.xml<dependencies> 中声明坐标来引入外部库。

基本依赖声明示例

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.14.0</version>
    </dependency>
</dependencies>

保存后 Maven 将自动下载该 jar 及其传递依赖至本地仓库,并加入 classpath。

依赖范围(scope)

通过 scope 控制依赖生效的类路径范围:

范围 编译 测试 运行 打包 典型场景
compile(默认) 常用框架
provided Servlet API(由容器提供)
runtime JDBC 驱动
test JUnit、测试工具
system 本地 jar(不推荐)

传递性依赖与冲突解决

  • 传递性依赖:A 依赖 B,B 依赖 C,则 A 自动获得 C(依赖传递)。
  • 依赖冲突:当多个依赖引入同一个 jar 的不同版本时,Maven 采用 最短路径优先 原则;路径相同则 先声明者优先
  • 通过 <exclusions> 排除不需要的传递依赖:
<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <exclusions>
        <exclusion>
            <groupId>冲突组ID</groupId>
            <artifactId>冲突构ID</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 查看依赖树命令:mvn dependency:tree,便于定位冲突。

Maven 生命周期与插件

Maven 定义了三套相互独立的生命周期,每个生命周期由多个阶段组成:

  1. clean:清理项目(仅 clean 阶段)
  2. default:核心构建(编译、测试、打包、安装、部署等)
  3. site:生成项目站点文档

常用 default 生命周期阶段

阶段 作用
validate 验证项目是否正确且所有必要信息可用
compile 编译源代码
test 运行单元测试(使用 surefire 插件)
package 将编译后代码打包成 jar / war 等
verify 集成测试等校验
install 将包安装到本地仓库,供其他本地项目依赖
deploy 将包部署到远程仓库(如私服中央仓库)

执行某个阶段时,之前的所有阶段会按顺序自动执行。例如 mvn package 会先 validate、compile、test 再 package。

插件(Plugin)

Maven 所有功能均由插件实现,插件绑定到生命周期阶段上执行。

  • 核心插件:如 maven-compiler-plugin(编译)、maven-surefire-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>

常见构建命令

# 清理 target 目录
mvn clean

# 编译源代码
mvn compile

# 运行测试
mvn test

# 打包(生成 jar/war)
mvn package

# 安装到本地仓库
mvn install

# 跳过测试进行打包
mvn package -DskipTests

# 查看依赖树
mvn dependency:tree

# 生成 Eclipse 项目文件
mvn eclipse:eclipse

多模块项目

当一个项目包含多个子模块时,可以通过聚合 POM 管理:

根目录 pom.xml<packaging>pom,并使用 <modules> 声明子模块:

<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>

<modules>
    <module>module-a</module>
    <module>module-b</module>
</modules>