文档站点
Skip to content

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'
}

对应关系 ​

概念MavenGradle
构建文件pom.xmlbuild.gradle(或 build.gradle.kts)
依赖<dependencies> XMLdependencies { implementation '...' }
版本管理spring-boot-starter-parentdependency-management 插件
命令mvn packagegradle build
启动mvn spring-boot:rungradle bootRun
跑测试mvn testgradle test
清理mvn cleangradle clean
Wrapper./mvnw./gradlew

scope 对应 ​

Maven scopeGradle 配置
compileimplementation
providedcompileOnly
runtimeruntimeOnly
testtestImplementation

用 Maven 还是 Gradle?

情况选
本教程示例 / 国内教程主流Maven
公司已有 Maven 项目Maven(跟随存量)
新项目且团队熟悉 Groovy/KotlinGradle
Android 生态Gradle

两者只是构建工具,项目代码、Spring Boot 能力完全一致。核心要学的是「依赖怎么声明、命令怎么跑」,而不是纠结哪个更好。

常用排障 ​

问题解法
依赖下载慢配阿里云镜像仓库(<mirror>),国内必做
依赖冲突 / NoSuchMethodErrormvn dependency:tree 看冲突,排除:<exclusions>
IDEA 不识别依赖Maven 面板点「Reload All Maven Projects」
打包出的 jar 跑不起来缺 spring-boot-maven-plugin,fat jar 没生成
本地仓库损坏删 ~/.m2/repository 下对应目录重下

面向 PHP / Laravel 开发者的 Spring Boot 中文文档