Maven

返回构建工具


核心概念

坐标(GAV)唯一标识一个构件:

<groupId>com.example</groupId>      <!-- 组织/公司 -->
<artifactId>my-app</artifactId>     <!-- 项目名 -->
<version>1.0.0</version>            <!-- 版本 -->

仓库

类型说明
本地仓库~/.m2/repository,优先查找
私服(Nexus/Artifactory)公司内部镜像,管控依赖
中央仓库repo.maven.apache.org,最终来源

查找顺序:本地仓库 → 私服 → 中央仓库。


生命周期

Maven 有三套独立生命周期,常用的是 default

validate → compile → test → package → verify → install → deploy
阶段说明
compile编译 src/main/java
test编译并运行 src/test/java
package打包为 jar/war
install安装到本地仓库
deploy发布到远程仓库

执行某个阶段会自动执行其前面所有阶段,例如 mvn package = compile → test → package。

另外两套生命周期:

  • clean:pre-clean → clean → post-clean
  • site:生成项目文档站点

依赖范围(scope)

scope编译测试运行打包说明
compile(默认)最常用
provided容器提供,如 servlet-api
runtime运行时需要,如 JDBC 驱动
test仅测试,如 JUnit
system指定本地路径,不推荐

依赖传递与冲突

A → B → C,A 间接依赖 C(传递依赖)。

冲突解决规则

  1. 最短路径优先A→B→C:1.0A→C:2.0,选 C:2.0
  2. 声明顺序优先:路径相同时,pom.xml 中先声明的优先

排除传递依赖

<dependency>
    <groupId>com.example</groupId>
    <artifactId>b</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.example</groupId>
            <artifactId>c</artifactId>
        </exclusion>
    </exclusions>
</dependency>

强制指定版本(在 <dependencyManagement> 中声明):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>c</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

BOM(Bill of Materials)

统一管理一组相关依赖的版本,避免版本冲突:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

引入后,声明 Spring 相关依赖无需指定版本号。


多模块项目

parent/
├── pom.xml              ← 父 pom,packaging = pom
├── module-a/
│   └── pom.xml
└── module-b/
    └── pom.xml

父 pom 声明 <modules> 统一管理子模块,子模块通过 <parent> 继承父 pom 的依赖版本和插件配置。


常用插件

插件说明
maven-compiler-plugin控制编译版本(source/target
maven-surefire-plugin运行单元测试
maven-failsafe-plugin运行集成测试
maven-shade-plugin打 fat jar(含所有依赖)
spring-boot-maven-plugin打可执行 Spring Boot jar

常用命令

mvn clean                    # 清理 target/
mvn compile                  # 编译
mvn test                     # 运行测试
mvn package                  # 打包
mvn package -DskipTests      # 打包跳过测试
mvn install                  # 安装到本地仓库
mvn deploy                   # 发布到远程仓库
mvn dependency:tree          # 查看依赖树
mvn dependency:analyze       # 分析无用/缺失依赖
mvn help:effective-pom       # 查看完整合并后的 pom

settings.xml 常用配置

~/.m2/settings.xml

<settings>
    <!-- 配置镜像加速(如阿里云) -->
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
 
    <!-- 配置私服认证 -->
    <servers>
        <server>
            <id>nexus</id>
            <username>admin</username>
            <password>password</password>
        </server>
    </servers>
</settings>