Maven 与 Gradle 是 Java 生态的两大主流构建工具,负责依赖管理、编译、测试、打包与发布。选型之争常见于新项目启动时:Maven 以约定与稳定著称,Gradle 以灵活与速度见长。本章不站队,而是给出工程视角的选型决策逻辑,并分别展示两种工具的核心写法与版本管理的实践要点。
| 维度 | Maven | Gradle |
|---|---|---|
| 核心模型 | 生命周期 + 插件(约定优于配置) | 任务图(Task Graph) |
| 配置文件 | pom.xml(XML) | build.gradle / build.gradle.kts(Groovy/Kotlin) |
| 目录结构 | 约定固定(src/main/java) | 约定为主,可自定义 |
| 构建速度 | 较慢 | 快(增量构建 + 构建缓存) |
| 灵活性 | 中,插件生态规范 | 高,可脚本化任意构建逻辑 |
| 学习成本 | 低 | 中高 |
| 场景 | 推荐 |
|---|---|
| 团队已有规范 | 跟随团队,不要为"更先进"随意切换 |
| 多数 Java 中后台新项目 | Maven(更稳妥、易统一规范) |
| 构建逻辑复杂、高度脚本化 | Gradle |
| Android / 大型多模块 | Gradle(事实标准) |
选型原则:构建工具是团队基础设施,一致性比先进性更重要。避免项目间混用导致仓库代理、插件规范、CI 脚本各搞一套。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0.0</version>
<properties>
<java.version>21</java.version>
<spring-boot.version>3.3.0</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>dependencyManagement 只声明版本、不直接引入依赖,子模块引用时无需再写版本号——这是版本收敛的核心机制。
plugins {
java
id("org.springframework.boot") version "3.3.0"
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}| 操作 | Maven | Gradle |
|---|---|---|
| 编译 | mvn compile | gradle compileJava |
| 测试 | mvn test | gradle test |
| 打包 | mvn package | gradle build |
| 跳过测试打包 | mvn package -DskipTests | gradle build -x test |
| 多环境 | mvn package -P prod(profile) | gradle build -Penv=prod(属性) |
implementation("com.example:lib:1.0") {
exclude(group = "commons-logging", module = "commons-logging")
}| 版本类型 | 特性 | 使用 |
|---|---|---|
| SNAPSHOT | 每次构建可拉取最新快照 | 开发期联调 |
| 正式版本 | 不可变、可复现 | 发布与生产 |
生产构建必须使用正式版本——SNAPSHOT 的"每次变化"会让构建结果不可复现。
mvn dependency:tree / gradle dependencies 是排障第一步;下一章讲解 Harbor 企业级私有仓库——镜像仓库的权限、复制与高可用方案。