# Maven vs Gradle 对照表（第 1 章配套阅读）

> 这是一份"看到 Maven 配置，想知道 Gradle 怎么写"的速查表。可以在迁移老项目时直接对照。

---

## 1. 项目坐标 & JDK 版本

### Maven
```xml
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0.0</version>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>
```

### Gradle (Kotlin DSL)
```kotlin
group = "com.example"
version = "1.0.0"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}
```

---

## 2. 依赖仓库

### Maven
```xml
<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </repository>
</repositories>
```

### Gradle
```kotlin
repositories {
    mavenCentral()
    // 可选：Google Maven、私服等
    // google()
    // maven("https://my-private-repo.example.com")
}
```

---

## 3. 依赖声明

| Maven scope | Gradle 配置 | 说明 |
|---|---|---|
| `compile`（已废弃） | `implementation` | 编译期 + 运行期可见，不传递给消费者 |
| `compile` + 暴露 | `api` | 同 implementation 但**会传递**给消费者 |
| `provided` | `compileOnly` | 只编译期可见，不打进 jar（如 Servlet API） |
| `runtime` | `runtimeOnly` | 只运行期需要，不参与编译（如 JDBC 驱动） |
| `test` | `testImplementation` | 仅测试代码可见 |

### Maven
```xml
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>6.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```

### Gradle
```kotlin
dependencies {
    implementation("org.springframework:spring-core:6.1.1")
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
}
```

---

## 4. 依赖排除（exclude）

### Maven
```xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>6.1.1</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
```

### Gradle
```kotlin
implementation("org.springframework:spring-core:6.1.1") {
    exclude(group = "commons-logging", module = "commons-logging")
}
```

---

## 5. 强制版本

### Maven
```xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.0.0-jre</version>
        </dependency>
    </dependencies>
</dependencyManagement>
```

### Gradle
```kotlin
configurations.all {
    resolutionStrategy.force("com.google.guava:guava:32.0.0-jre")
}

// 或更现代的写法
dependencies {
    implementation("com.google.guava:guava") {
        version { strictly("32.0.0-jre") }
    }
}
```

---

## 6. 插件应用

### Maven
```xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.2.0</version>
        </plugin>
    </plugins>
</build>
```

### Gradle
```kotlin
plugins {
    id("org.springframework.boot") version "3.2.0"
}
```

---

## 7. 多模块

### Maven
```xml
<!-- 根 pom.xml -->
<modules>
    <module>app</module>
    <module>lib</module>
</modules>
```

### Gradle
```kotlin
// settings.gradle.kts
include("app", "lib")
```

模块间引用：

| Maven | Gradle |
|---|---|
| `<dependency><groupId>com.example</groupId><artifactId>lib</artifactId></dependency>` | `implementation(project(":lib"))` |

---

## 8. 常用命令

| 用途 | Maven | Gradle |
|---|---|---|
| 清理 | `mvn clean` | `./gradlew clean` |
| 编译 | `mvn compile` | `./gradlew classes` |
| 测试 | `mvn test` | `./gradlew test` |
| 打包 | `mvn package` | `./gradlew jar` 或 `./gradlew assemble` |
| 完整构建 | `mvn install` | `./gradlew build` |
| 看依赖树 | `mvn dependency:tree` | `./gradlew dependencies` |
| 看任务列表 | `mvn help:describe -Dplugin=…` | `./gradlew tasks` |
| 跑应用 | `mvn spring-boot:run` | `./gradlew bootRun` |
| 跳过测试 | `mvn install -DskipTests` | `./gradlew build -x test` |
| 离线构建 | `mvn -o install` | `./gradlew --offline build` |
| 调试输出 | `mvn -X` | `./gradlew --debug` |

---

## 9. 自定义任务

### Maven
**必须开发独立的 Mojo Plugin（一个完整的 Java 项目）**，发布到本地或远程仓库才能用。约 200 行代码起步。

### Gradle
**当场就能写**：
```kotlin
tasks.register("countLines") {
    doLast {
        val total = fileTree("src/main/java")
            .matching { include("**/*.java") }
            .sumOf { it.readLines().size }
        println("Total Java lines: $total")
    }
}

// 跑：./gradlew countLines
```

---

## 总结

| 维度 | Maven | Gradle |
|------|-------|--------|
| 学习曲线 | 平缓，背几个标签就能写 | 较陡，要理解生命周期 |
| 灵活度 | 低（要扩展必须开发插件） | 极高（脚本本身是代码） |
| 啰嗦度 | 高（XML） | 低（DSL） |
| 性能 | 一般，无增量 | 极快（增量 + 缓存 + Daemon） |
| 何时用 Maven | 项目简单、团队不熟 Gradle | / |
| 何时用 Gradle | Android、复杂工程、性能敏感 | 几乎所有现代 JVM 项目 |
