Gradle vs Maven 详细对比

一、基本概念

| 特性 | Maven | Gradle | |------|-------|--------| | 配置文件 | XML(pom.xml) | Groovy/Kotlin DSL(build.gradle) | | 设计理念 | 约定优于配置 | 灵活、可编程 | | 构建语言 | XML(声明式) | Groovy/Kotlin(脚本式) |


二、配置文件格式对比

Maven(XML 格式)
复制代码
  1. <!-- pom.xml - 您的后端项目 -->
  2. <project>
  3. <groupId>com.mapnotify</groupId>
  4. <artifactId>map-notify</artifactId>
  5. <version>1.0.0</version>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. </dependencies>
  12. <build>
  13. <plugins>
  14. <plugin>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-maven-plugin</artifactId>
  17. </plugin>
  18. </plugins>
  19. </build>
  20. </project>

特点: - XML 格式,结构固定 - 标签嵌套,较冗长 - 声明式,配置为主

Gradle(Groovy DSL 格式)
复制代码
// build.gradle - 您的Android项目
plugins {
    id 'com.android.application'
}

android {
    namespace 'com.mapnotify.app'
    compileSdk 33

    defaultConfig {
        applicationId "com.mapnotify.app"
        minSdk 21
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'cn.jiguang.sdk:jpush:5.1.6'
}

特点: - Groovy/Kotlin DSL,更简洁 - 类似代码,可编程 - 支持条件逻辑和自定义任务


三、依赖管理对比

Maven 依赖声明
复制代码
<!-- pom.xml -->
<dependencies>
    <!-- 需要指定 groupId, artifactId, version -->
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.40</version>
    </dependency>

    <!-- 作用域用 scope -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
Gradle 依赖声明
复制代码
// build.gradle
dependencies {
    // 简洁格式:group:artifact:version
    implementation 'androidx.appcompat:appcompat:1.6.1'

    // 极光推送SDK
    implementation 'cn.jiguang.sdk:jpush:5.1.6'
    implementation 'cn.jiguang.sdk:jcore:3.0.0'

    // 测试依赖用 testImplementation
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
}

对比:

| Maven | Gradle | 说明 | |-------|--------|------| | <scope>compile</scope> | implementation | 编译和运行时依赖 | | <scope>provided</scope> | compileOnly | 仅编译时 | | <scope>test</scope> | testImplementation | 测试依赖 | | <scope>runtime</scope> | runtimeOnly | 仅运行时 |


四、构建生命周期对比

Maven 生命周期(固定阶段)
复制代码
# Maven 有固定的生命周期阶段
mvn clean          # 清理
mvn compile        # 编译
mvn test           # 测试
mvn package        # 打包(生成JAR/WAR)
mvn install        # 安装到本地仓库
mvn deploy         # 部署到远程仓库

Maven 生命周期:

复制代码
clean → validate → compile → test → package → verify → install → deploy
Gradle 任务(灵活自定义)
复制代码
# Gradle 使用任务(Task)系统
./gradlew clean              # 清理
./gradlew build              # 构建
./gradlew assembleDebug      # 打包Debug版本(Android)
./gradlew assembleRelease    # 打包Release版本
./gradlew installDebug       # 安装Debug版本到设备

Gradle 任务示例:

复制代码
// 可以自定义任务
task hello {
    doLast {
        println 'Hello Gradle!'
    }
}

// Android项目自动生成的任务
// assembleDebug, assembleRelease, installDebug 等

五、打包方式对比

Maven 打包(Spring Boot)
复制代码
<!-- pom.xml -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

打包命令:

复制代码
mvn clean package
# 生成:target/map-notify-1.0.0.jar
# 这是一个可执行的JAR文件(包含所有依赖)
Gradle 打包(Android)
复制代码
// build.gradle
android {
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
        }
        debug {
            minifyEnabled false
        }
    }
}

打包命令:

复制代码
./gradlew assembleDebug
# 生成:app/build/outputs/apk/debug/app-debug.apk

./gradlew assembleRelease
# 生成:app/build/outputs/apk/release/app-release.apk

区别:

| 项目类型 | Maven | Gradle | |---------|-------|--------| | Java项目 | 生成 .jar 文件 | 生成 .jar 文件 | | Spring Boot | 生成可执行 .jar | 生成可执行 .jar | | Android | ❌ 不支持 | ✅ 生成 .apk 文件 | | Web项目 | 生成 .war 文件 | 生成 .war 文件 |


六、仓库配置对比

Maven 仓库
复制代码
<!-- pom.xml - 仓库在 settings.xml 或 pom.xml 中配置 -->
<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </repository>
</repositories>
Gradle 仓库
复制代码
// build.gradle(项目级)
allprojects {
    repositories {
        google()           // Google仓库(Android专用)
        mavenCentral()     // Maven中央仓库
        maven { url 'https://jitpack.io' }  // 自定义仓库
    }
}

// settings.gradle(新版本)
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

七、多模块项目对比

Maven 多模块
复制代码
<!-- 父pom.xml -->
<modules>
    <module>module1</module>
    <module>module2</module>
</modules>
Gradle 多模块
复制代码
// settings.gradle
rootProject.name = "MapNotifyApp"
include ':app'           // 主模块
include ':library'       // 库模块

八、性能对比

| 特性 | Maven | Gradle | |------|-------|--------| | 构建速度 | 较慢 | 更快(增量构建、缓存) | | 首次构建 | 慢 | 慢(需要下载依赖) | | 增量构建 | 支持但较慢 | 优秀(只编译变化部分) | | 并行构建 | 支持 | 支持且更高效 | | 守护进程 | ❌ | ✅(Gradle Daemon) |

Gradle 优势: - 增量构建:只编译变化的部分 - 构建缓存:复用之前的构建结果 - 守护进程:常驻内存,加快启动


九、灵活性对比

Maven:约定优于配置
复制代码
<!-- Maven 有固定的目录结构 -->
src/
  main/
    java/        # 源代码
    resources/   # 资源文件
  test/
    java/        # 测试代码
Gradle:高度可定制
复制代码
// Gradle 可以自定义目录结构
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', 'src/custom/java']
        }
        resources {
            srcDirs = ['src/main/resources', 'src/custom/resources']
        }
    }
}

// 可以写自定义逻辑
android {
    applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "app-${variant.name}-${variant.versionName}.apk"
        }
    }
}

十、实际项目中的使用场景

您的项目结构
复制代码
map-notify/
├── pom.xml                    # Maven配置(后端)
├── src/                       # Java源代码
└── android-app/
    ├── build.gradle           # Gradle配置(项目级)
    ├── settings.gradle        # Gradle设置
    └── app/
        └── build.gradle       # Gradle配置(模块级)

为什么这样设计?

  1. 后端服务(Spring Boot)

    • 使用 Maven:Java 生态常用,Spring Boot 官方支持
    • 打包:生成可执行 JAR
    • 命令:mvn clean package
  2. Android 应用

    • 使用 Gradle:Android 官方标准
    • 打包:生成 APK
    • 命令:./gradlew assembleDebug

十一、学习建议

如果您熟悉 Maven,学习 Gradle 的对应关系:

| Maven概念 | Gradle对应 | |-----------|-----------| | pom.xml | build.gradle | | <dependencies> | dependencies {} | | <plugin> | plugins {}apply plugin: | | mvn clean | ./gradlew clean | | mvn package | ./gradlew build | | <scope>test</scope> | testImplementation |


总结

| 维度 | Maven | Gradle | |------|-------|--------| | 配置文件 | XML(冗长) | Groovy/Kotlin(简洁) | | 学习曲线 | 简单(约定明确) | 中等(更灵活) | | 性能 | 较慢 | 更快 | | 灵活性 | 较低 | 很高 | | Android支持 | ❌ | ✅ 官方支持 | | Java项目 | ✅ 广泛使用 | ✅ 广泛使用 |

对于您的项目: - 后端继续用 Maven(Spring Boot 生态) - Android 用 Gradle(官方标准)

两者可以共存,互不干扰。需要我进一步解释某个具体配置吗?

相关推荐
q***23922 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
q***78782 小时前
Spring Boot的项目结构
java·spring boot·后端
q***96582 小时前
Spring Data JDBC 详解
java·数据库·spring
Kuo-Teng3 小时前
LeetCode 118: Pascal‘s Triangle
java·算法·leetcode·职场和发展·动态规划
倚肆3 小时前
HttpServletResponse 与 ResponseEntity 详解
java·后端·spring
悟能不能悟3 小时前
java List怎么转换为Vector
java·windows·list
yaoxin5211233 小时前
241. Java 集合 - 使用 Collections 工厂类处理集合
java·windows
依_旧3 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
white-persist3 小时前
差异功能定位解析:C语言与C++(区别在哪里?)
java·c语言·开发语言·网络·c++·安全·信息可视化