Maven 与 Gradle
本教程所有示例用 Maven。这篇作为补充:先讲透 Maven 的核心概念(毕竟所有示例都依赖它),再给一份「Gradle 版对照」,方便遇到 Gradle 项目时不慌。
Maven 核心概念
pom.xml:项目的心脏
pom.xml 相当于 composer.json + 构建脚本。核心区域:
xml
<project>
<!-- 坐标:唯一标识一个构件 -->
<groupId>com.example</groupId> <!-- 组织(≈ Vendor\) -->
<artifactId>blog</artifactId> <!-- 项目名 -->
<version>0.0.1-SNAPSHOT</version> <!-- 版本(SNAPSHOT=开发版) -->
<packaging>jar</packaging> <!-- jar=可执行包, war=外置容器 -->
<!-- 父 POM:Spring Boot 统一管理版本(关键!) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
</parent>
<!-- 依赖(≈ require) -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 不写 version:继承父 POM 管理 -->
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>为什么依赖基本不用写 version?
spring-boot-starter-parent 里管理了所有 Spring 相关依赖的版本。你加 starter 时不用写 version,Maven 自动用父 POM 的版本 —— 这就是「版本集中管理」,对应 Composer 的 lock 文件职责。手动写 version 反而容易出冲突。
三个坐标 = 一个构件
| 坐标 | 作用 | 类比 |
|---|---|---|
groupId | 组织名 | vendor(如 laravel/framework 的 laravel) |
artifactId | 项目名 | framework |
version | 版本 | ^10.0 的解析结果 |
Maven 依赖 group:artifact:version 三元组找包,和 Composer 的 vendor/package:version 一个道理。
常用命令
| 命令 | 作用 | 类比 |
|---|---|---|
mvn compile | 编译 | — |
mvn test | 跑测试 | php artisan test |
mvn package | 打包(含测试) | composer install --no-dev + 打包 |
mvn clean | 清空 target/ | php artisan optimize:clear 类似概念 |
mvn spring-boot:run | 启动 | php artisan serve |
mvn dependency:tree | 看依赖树(排查冲突) | composer show |
推荐用 Wrapper
项目自带的 ./mvnw(Windows 是 mvnw.cmd)会自动下载匹配的 Maven 版本,团队统一环境、CI 免装 Maven。能 mvnw 就 mvnw。
依赖作用域 scope
| scope | 什么时候生效 | 类比 |
|---|---|---|
compile(默认) | 编译 + 运行 | 普通 require |
provided | 编译期有,运行期容器提供 | 打 war 时内置 Tomcat 用它 |
runtime | 只运行期(如 JDBC 驱动) | — |
test | 只测试期 | require-dev |
optional | 不传递 | suggest |
xml
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope> <!-- 只运行需要 -->
</dependency>Gradle:用 Groovy/Kotlin 写的构建脚本
Gradle 是新项目(尤其 Android、部分新 Java 服务)的选择。它比 Maven 快(增量构建)、脚本更灵活。核心对照:
build.gradle(依赖声明)
groovy
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0'
id 'io.spring.dependency-management' version '1.1.5'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}对应关系
| 概念 | Maven | Gradle |
|---|---|---|
| 构建文件 | pom.xml | build.gradle(或 build.gradle.kts) |
| 依赖 | <dependencies> XML | dependencies { implementation '...' } |
| 版本管理 | spring-boot-starter-parent | dependency-management 插件 |
| 命令 | mvn package | gradle build |
| 启动 | mvn spring-boot:run | gradle bootRun |
| 跑测试 | mvn test | gradle test |
| 清理 | mvn clean | gradle clean |
| Wrapper | ./mvnw | ./gradlew |
scope 对应
| Maven scope | Gradle 配置 |
|---|---|
compile | implementation |
provided | compileOnly |
runtime | runtimeOnly |
test | testImplementation |
用 Maven 还是 Gradle?
| 情况 | 选 |
|---|---|
| 本教程示例 / 国内教程主流 | Maven |
| 公司已有 Maven 项目 | Maven(跟随存量) |
| 新项目且团队熟悉 Groovy/Kotlin | Gradle |
| Android 生态 | Gradle |
两者只是构建工具,项目代码、Spring Boot 能力完全一致。核心要学的是「依赖怎么声明、命令怎么跑」,而不是纠结哪个更好。
常用排障
| 问题 | 解法 |
|---|---|
| 依赖下载慢 | 配阿里云镜像仓库(<mirror>),国内必做 |
| 依赖冲突 / NoSuchMethodError | mvn dependency:tree 看冲突,排除:<exclusions> |
| IDEA 不识别依赖 | Maven 面板点「Reload All Maven Projects」 |
| 打包出的 jar 跑不起来 | 缺 spring-boot-maven-plugin,fat jar 没生成 |
| 本地仓库损坏 | 删 ~/.m2/repository 下对应目录重下 |