一、基础对比:Gradle vs Maven

1.1 核心特性对比

维度MavenGradle
配置语言XML (冗长)Groovy/Kotlin DSL (简洁灵活)
构建速度较慢(全量构建)快2-10倍(增量构建+缓存)
多模块管理<modules> + <parent>settings.gradle + project()
依赖管理<dependencies>dependencies { ... }
插件系统声明式编程式(可自定义逻辑)
学习曲线低(XML基础)中(需Groovy/Kotlin基础)

1.2 安装与配置对比

Maven 安装流程
wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip
unzip apache-maven-3.9.6-bin.zip
export MAVEN_HOME=/path/to/apache-maven-3.9.6
export PATH=$MAVEN_HOME/bin:$PATH
mvn -v  # 验证安装
Gradle 安装优势
wget https://services.gradle.org/distributions/gradle-8.5-bin.zip
unzip gradle-8.5-bin.zip
export GRADLE_HOME=/path/to/gradle-8.5
export PATH=$GRADLE_HOME/bin:$PATH
gradle -v  # 验证安装

​Gradle优势:​

  • 守护进程(Daemon)减少JVM启动时间
  • 支持Gradle Wrapper(无需全局安装)
  • Kotlin DSL提供类型安全

1.3 项目结构对比

Maven 标准结构
my-project/
├── pom.xml
└── src/├── main/│   ├── java/│   └── resources/└── test/├── java/└── resources/
Gradle 标准结构
my-project/
├── build.gradle
├── settings.gradle
└── src/├── main/│   ├── java/│   └── resources/└── test/├── java/└── resources/

​关键差异:​

  • settings.gradle管理多模块和项目名称
  • 构建逻辑在build.gradle而非pom.xml

1.4 构建脚本深度对比

Maven 配置示例
<!-- pom.xml -->
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0.0</version><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.3</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build>
</project>
Gradle 等效配置
// build.gradle (Groovy DSL)
plugins {id 'java'id 'org.jetbrains.kotlin.jvm' version '1.9.22' // 可选Kotlin支持
}group = 'com.example'
version = '1.0.0'repositories {mavenCentral()
}java {toolchain {languageVersion = JavaLanguageVersion.of(11)}
}dependencies {testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3'// Kotlin示例: implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}tasks.withType(Test) {useJUnitPlatform()
}

1.5 多模块项目配置

Maven 多模块配置
<!-- 父pom.xml -->
<modules><module>core</module><module>web</module>
</modules><!-- 子模块pom.xml -->
<parent><groupId>com.example</groupId><artifactId>parent</artifactId><version>1.0.0</version>
</parent>
Gradle 多模块配置
// settings.gradle
rootProject.name = 'my-app'
include 'core', 'web'// web/build.gradle
dependencies {implementation project(':core')// 可添加外部依赖implementation 'org.springframework.boot:spring-boot-starter-web:3.1.5'
}

1.6 构建任务对比

任务Maven 命令Gradle 命令
编译mvn compilegradle classes
运行测试mvn testgradle test
打包mvn packagegradle assemble
安装到本地mvn installgradle publishToMavenLocal
生成网页mvn sitegradle javadoc
清理mvn cleangradle clean
依赖分析mvn dependency:treegradle dependencies
运行应用mvn exec:javagradle run

1.7 性能优化对比

优化技术Maven实现Gradle实现
增量构建基于时间戳基于内容哈希
并行构建<maven.compile.parallel>true</maven.compile.parallel>org.gradle.parallel=true (gradle.properties)
构建缓存无内置支持本地+远程缓存
任务依赖优化手动配置自动分析任务依赖关系
守护进程Gradle Daemon

二、Maven 快速转 Gradle 迁移指南

2.1 自动转换工具

gradle init --type pom

​交互式配置:​

Select build script DSL:1: Groovy2: Kotlin
> 2  # 推荐选择Kotlin DSLGenerate build using new APIs and behavior (some may be incompatible with existing scripts)?
> yes

​生成文件结构:​

.
├── build.gradle.kts       # 主构建脚本
├── settings.gradle.kts    # 项目配置
├── gradlew                # Unix构建脚本
├── gradlew.bat            # Windows构建脚本
└── gradle/                # Gradle包装器

2.2 手动调整关键配置

依赖作用域映射表
Maven 作用域Gradle 配置特殊说明
compileimplementation默认转换结果
testtestImplementation自动转换
providedcompileOnly需手动检查Web容器依赖
runtimeruntimeOnly需确认是否真的需要
system❌ 不支持建议改用文件依赖或Maven仓库

​修正示例:​

dependencies {// 修正Servlet API依赖compileOnly("javax.servlet:javax.servlet-api:4.0.1")// 文件依赖示例implementation(files("lib/custom-lib.jar"))
}

2.3 插件转换对照表

Maven 插件Gradle 等效配置
maven-compiler-plugin内置Java插件,配置java.toolchain
spring-boot-maven-plugin添加org.springframework.boot插件
maven-surefire-plugin内置测试支持
maven-jar-plugin使用jar任务配置
maven-assembly-plugin使用DistributionPlugin

​Spring Boot项目配置:​

plugins {id("org.springframework.boot") version "3.1.5"id("io.spring.dependency-management") version "1.1.3"
}tasks.named<BootJar>("bootJar") {archiveBaseName = "my-app"archiveVersion = "1.0.0"
}

2.4 多模块项目配置

​根项目配置 (settings.gradle.kts):​

rootProject.name = "parent.project"
include("module-core","module-web","module-service:submodule-a",  // 支持嵌套模块"module-service:submodule-b"
)

​子模块依赖配置:​

// module-web/build.gradle.kts
dependencies {implementation(project(":core"))implementation("com.google.guava:guava:32.1.3-jre")
}

三、性能优化方案

3.1 构建加速配置

// 启用配置缓存(Gradle 8.0+)
tasks.withType<ConfigurationCache> {mode = ConfigurationCache.Mode.REMOTE
}// 分布式缓存配置
buildCache {remote<HttpBuildCache> {url = uri("https://cache.internal")credentials {username = "cache-user"password = "secret"}}
}

3.2 常见问题解决方案

问题类型解决方案
依赖冲突configurations.all { resolutionStrategy.force("com.google.guava:guava:32.1.3-jre") }
构建速度慢启用 --parallel + 配置 org.gradle.workers.max=8
测试失败缓存test { outputs.upToDateWhen { false } }
资源处理异常添加 processResources { duplicatesStrategy = DuplicatesStrategy.INCLUDE }

四、验证与调试

4.1 构建验证流程

# 清洁构建
./gradlew clean build# 测试验证
./gradlew test --info       # 显示测试日志
./gradlew test --continue   # 继续执行失败后的测试# 产物检查
unzip -l build/libs/my-app.jar  # 检查JAR内容
jar tf build/libs/my-app.war    # 检查WAR内容

4.2 依赖分析工具

# 生成依赖树
./gradlew :module-name:dependencies > deps.txt# 可视化依赖报告
./gradlew htmlDependencyReport  # 生成HTML报告# 依赖冲突检测
./gradlew dependencyInsight --dependency guava --configuration runtimeClasspath

4.3 构建扫描分析

./gradlew build --scan

​关键指标检查:​

  • 任务执行时间分布
  • 依赖下载时间
  • 缓存命中率
  • 配置时间占比

五、迁移后优化建议

5.1 构建脚本重构

// settings.gradle.kts
dependencyResolutionManagement {repositories {mavenCentral()google()maven { url = uri("https://plugins.gradle.org/m2/") }}
}

5.2 CI/CD 集成示例

# .github/workflows/build.yml
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- name: Setup JDKuses: actions/setup-java@v3with:java-version: '17'- name: Gradle Buildrun: ./gradlew build --scanenv:GRADLE_OPTS: "-Dorg.gradle.caching=true"

5.3 监控仪表盘配置

./gradlew build --scan --metrics
# 生成包含以下指标的报告:
# - 任务执行时间分布
# - 依赖下载耗时
# - 内存使用峰值
# - 配置时间占比

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95221.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95221.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95221.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pcl 按比例去除点云的噪点

之前halcon3d中是这么做的&#xff1b;1&#xff0c;先查找点云中每个点最近第15个最近点的距离2&#xff0c;将距离进行排序3&#xff0c;求排序后在距离数组70%位置的距离 d4&#xff0c;筛选点云中每个点半径为d&#xff0c;近邻点的数量大于14的点用pcl实现的代码如下&…

站在Vue的角度,对比鸿蒙开发中的递归渲染

第三类 引用数据的操作 引用数据类型 又叫复杂数类型&#xff0c; 典型的代表是对象和数组&#xff0c;而数组和对象往往又嵌套到到一起 普通数组和对象的使用 vue中使用for循环遍历 <template><div>我是关于页面<div v-for"item in arr">{{ i…

VBS 流程控制

一. if else 和 selec case 1. if end if Dim a a2If a0 ThenMsgBox "这里是0"End if 2. if else end if Dim a a2If a0 ThenMsgBox "这里是0"Else MsgBox "这里是2" 弹窗“这里是2”End if 3. if -----elseif-------else-------end…

HCIP项目之OSPF综合实验

一、项目背景随着企业分支机构地理分散化&#xff0c;跨地域网络互联需求激增。MGRE&#xff08;多点 GRE&#xff09;技术因适应动态拓扑、降低链路成本&#xff0c;成为多分支互联的常用方案&#xff1b;OSPF 作为链路状态路由协议&#xff0c;适用于大型网络且支持可变长子网…

class and enmu class

传统枚举与作用域污染及enum class的详细介绍在编程中&#xff0c;枚举&#xff08;enum&#xff09;是一种常见的特性&#xff0c;用于定义一组命名的常量。传统枚举&#xff08;如C中的enum&#xff09;虽然简单易用&#xff0c;但容易导致作用域污染问题。而enum class&…

Numpy科学计算与数据分析:Numpy数组属性入门之形状、维度与大小

Numpy数组属性探索 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy数组的基本属性&#xff0c;如形状&#xff08;shape&#xff09;、维度&#xff08;ndim&#xff09;和大小&#xff08;size&#xff09;&#xff0c;并能够通过实际操作加深对这些属性的理解。 相…

IF 33.3+ 通过多区域单细胞测序解析肺腺癌的空间和细胞结构

通过多区域单细胞测序解析肺腺癌的空间和细胞结构摘要对于肺腺癌演进过程中单个细胞群的地理空间架构知之甚少。在此&#xff0c;我们对来自5例早期LUAD和14个来自肿瘤的具有明确空间邻近性的多区域正常肺组织的186&#xff0c;916个细胞进行了单细胞RNA测序。我们发现细胞谱系…

【Redis的安装与配置】

一&#xff1a;下载 Redis ✅ 百度网盘分享 &#x1f449; https://pan.baidu.com/s/1xkrLlyUPyM0btCFFpGEhcw?pwdSVIP ✅ 从Github下载 &#x1f449; https://github.com/MicrosoftArchive/redis/releases 二&#xff1a;安装 Redis 1️⃣ 将下载的压缩包文件 解压到 某个文…

TDSQL GTS文件说明

基于时间点恢复&#xff1a;全备xlogGTS文件 在TDSQL的备份恢复体系中&#xff0c;GTS文件是全局时间戳&#xff08;Global Timestamp&#xff09;的存储载体&#xff0c;用于记录事务在分布式环境中的精确执行顺序和时间点 其核心作用体现在以下方面&#xff1a; 1‌。时间基准…

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析 全星研发项目管理APQP软件系统是专为汽车零部件行业打造的数字化研发管理平台&#xff0c;通过深度集成行业核心工具链&#xff0c;实现从产品设计到量产的全程可控。以下为该系统在汽车零部件行业的应用解析&#xf…

网络通信安全:HTTPS协议的密码学基石

引言&#xff1a;从HTTP到HTTPS的安全升级 在网络通信中&#xff0c;数据传输的安全性至关重要。早期的HTTP协议采用明文传输&#xff0c;存在三大安全隐患&#xff1a; 机密性问题&#xff1a;数据在传输过程中可能被窃听&#xff08;如公共Wi-Fi中的监听&#xff09;&#xf…

pip 和 conda,到底用哪个安装?

为什么 pip 有时装不下来而 --prefer-binary 可以&#xff1f;什么是源代码发行版&#xff1f;什么是轮子&#xff1f;conda 和 pip 有什么区别&#xff1f;优先用谁啊&#xff1f;两者适合的场景&#xff08;何时用哪个&#xff09;安装路径&#xff1a;pip / conda 分别装到哪…

bert学习

首先了解一下几种embedding。比如elmo就是一个embedding模型。one-hot编码只能实现one word one embedding&#xff0c;而我们的elmo能实现one token one embeddingElmo是基于双向LSTM&#xff0c;所以每个词其实会有正向和反向两个预测结果&#xff0c;那么我们用哪个呢&#…

Java安全-组件安全

一、Xstream启动环境并访问接下来我们构造反弹shell语句&#xff0c;bash -i >& /dev/tcp/8.152.2.86/9999 0>&1&#xff0c;紧接着对其进行base64编码。接下来使用命令即可首先开启监听接下来执行命令接下来抓包对其进行payload构造即可紧接着回去查看回显发现成…

【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录

微网优联——微网优联 嵌入式技术一面&#xff0c;校招&#xff0c;问答记录 1. 2 分钟简单自自我介绍2. 问一遍笔试题目3. IP地址在哪个层4.手动配置过IP地址吗?要配哪几个&#xff1f;5. ARP 是域名找IP地址还是IP地址找域名?6. Linux、计算机网络、操作系统掌握的怎么样&a…

C#使用EPPlus读写Excel

依赖EPPlus 获取依赖可以阅读:Nuget For Unity插件介绍_nugetforunity-CSDN博客 可以参阅该篇快速入门:在Unity中使用Epplus写Excel_unity epplus-CSDN博客 下面是我封装的几个方法: 要在合适的时机配置许可证,比如你的工具类的静态函数.建议使用版本7.7.1 #region Excel封装,…

高性能Web服务器

一、Web服务基础介绍 1.1、互联网发展历程 1993年3月2日&#xff0c;中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实验室的64K专线正式开通&#xff0c;成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站中国黄…

《算法导论》第 16 章 - 贪心算法

大家好&#xff01;今天我们来深入探讨《算法导论》第 16 章的核心内容 —— 贪心算法。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。它在许多优化问题中都有广泛应…

Redis面试精讲 Day 18:Redis网络优化与连接管理

【Redis面试精讲 Day 18】Redis网络优化与连接管理 开篇 欢迎来到"Redis面试精讲"系列第18天&#xff0c;今天我们将深入探讨Redis网络优化与连接管理技术。在分布式系统中&#xff0c;Redis的网络性能和连接管理直接影响整个系统的响应速度和稳定性。掌握这些优化…

Centos8系统在安装Git包时,报错:“没有任何匹配: git”

报错类型&#xff1a; sudo dnf install git Repository AppStream is listed more than once in the configuration Repository BaseOS is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository fasttrac…