Gradle vs Maven 详细对比
一、基本概念
| 特性 | Maven | Gradle | |------|-------|--------| | 配置文件 | XML(pom.xml) | Groovy/Kotlin DSL(build.gradle) | | 设计理念 | 约定优于配置 | 灵活、可编程 | | 构建语言 | XML(声明式) | Groovy/Kotlin(脚本式) |
二、配置文件格式对比
Maven(XML 格式)
- <!-- pom.xml - 您的后端项目 -->
- <project>
- <groupId>com.mapnotify</groupId>
- <artifactId>map-notify</artifactId>
- <version>1.0.0</version>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
特点: - XML 格式,结构固定 - 标签嵌套,较冗长 - 声明式,配置为主
Gradle(Groovy DSL 格式)
// build.gradle - 您的Android项目
plugins {id 'com.android.application'
}android {namespace 'com.mapnotify.app'compileSdk 33defaultConfig {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:versionimplementation 'androidx.appcompat:appcompat:1.6.1'// 极光推送SDKimplementation 'cn.jiguang.sdk:jpush:5.1.6'implementation 'cn.jiguang.sdk:jcore:3.0.0'// 测试依赖用 testImplementationtestImplementation '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 → deployGradle 任务(灵活自定义)
# 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 falseproguardFiles 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配置(模块级)为什么这样设计?
后端服务(Spring Boot)
- 使用 Maven:Java 生态常用,Spring Boot 官方支持
- 打包:生成可执行 JAR
- 命令:
mvn clean package
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(官方标准)
两者可以共存,互不干扰。需要我进一步解释某个具体配置吗?
