Gradle模块化最佳实践

一,模块化的原因及意义

模块化是一种将大型的软件系统拆分成相互独立的模块的方法。具有以下优势:

  • 代码复用:不同的模块可以共享相同的代码。这样可以避免重复编写相同的代码,提高开发效率。
  • 模块独立性:每个模块都可以独立构建、测试和部署。这样可以降低整个项目的维护成本,例如当有一个模块需要更新时,只需要重新构建该模块而不会影响其他模块。
  • 模块化开发:开发人员可以专注于某个特定的模块,而不需要关心整个项目的复杂性。这样可以提高开发效率和代码质量。
  • 可扩展性:通过定义模块之间的依赖关系,可以方便地引入和管理第三方库和框架。这样可以提高项目的灵活性和可扩展性。

JDK从9版本开始,也对基础类库进行了模块化

二、Gradle介绍

Gradle是一个基于JVM(不止java)的构建工具,用于自动化构建、测试、部署和发布软件项目。它支持多种编程语言,包括Java、Groovy和Kotlin,并且可以与各种开发工具和持续集成系统集成。

相比于老前辈maven,gradle的使用率可就没那么广泛了。maven依然是主导,gradle最大的用户还是Android平台,在其他领域运用依然很少。在java平台,Gradle最著名的项目非spring/springboot莫属了。

2.1Gradle后发优势

相比于maven,gradle具有以下优势:

  • 灵活性:代码即脚本,可以直接使用Groovy或Kotlin编写脚本,而Maven则需要转化为xml格式的插件,非常麻烦。
  • 性能:Gradle具有更好的构建性能。它使用增量编译和缓存机制,只重新构建有变更的部分,从而提高构建速度。而Maven则没有这样的机制,每次都会重新编译所有文件。这尤其在大型项目中能够显著减少构建时间。
  • 可读性:Gradle的构建脚本更易读和维护。它使用了一种声明性的语法,能够更清晰地表达构建逻辑和依赖关系。而Maven的XML格式相对较冗长和繁琐,不太直观。

2.2Gradle的劣势

有优势就肯定有劣势,如果gradle全面领先的话,那还有maven什么事呢?gradle存在以下劣势:

  • 学习曲线:相较于Maven,Gradle的学习曲线较陡峭。由于Gradle提供了更灵活的构建脚本语法和更强大的插件系统,初学者可能需要花费一些时间来熟悉和理解Gradle的概念和用法。主要是比较难入门,让很多人从入门到放弃
  • 文档和社区支持:相较于Maven,Gradle的生态支持相对较少。由于Maven出道早,运用广泛,在文档和社区方面更为成熟和丰富。

前一篇文章《Maven模块化最佳实践》介绍了如何使用maven进行模块化开发,本文继续讲述如何使用gradle进行模块化开发。

三,模块化的继承效果

在Gradle中,继承指的是使用父项目定义的配置信息来为子项目提供默认的配置。这种继承关系可以帮助开发者减少重复的配置,并确保子项目与父项目保持一致的构建方式。子模块可以继承的有以下内容

  • 配置
  • 依赖声明
  • 插件声明

3.1继承配置

在Gradle中,继承属性是指子项目可以继承父项目中定义的属性值,也可以重新覆盖父项目的同名参数。

在实践中,我们可以把所有子模块需要的依赖版本,编译参数等配置统一放到父模块进行声明。这样,便于查阅与修改。例如mmorpg-parent的builder.setting配置

ext {nettyVersion         = "4.1.33.Final"minaVersion 		 = "2.0.7"springBootVersion 	 = '2.6.0'gsonVersion 		 = "2.8.0"mysqlVersion 		 = "5.1.6"jacksonVersion		 = "2.12.1"protostuffVersion    = "1.5.9"protobufVersion 	 = "1.11.7"}

3.2继承依赖

继承依赖是指子项目可以继承父项目中定义的依赖管理。这样可以简化子项目的依赖配置,避免重复定义和维护。

3.2.1统一申明子模块的依赖,避免子模块直接依赖冲突。

dependencies {api ("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")api 'org.apache.commons:commons-lang3:3.4'compileOnly 'org.projectlombok:lombok:1.18.6'annotationProcessor 'org.projectlombok:lombok:1.18.6'implementation ("com.google.code.gson:gson:${gsonVersion}")implementation ("io.netty:netty-all:${nettyVersion}")
}

 3.2.2子模块统一模块

父模块可以把子模块都需要的依赖都统一进行申明,这样,子依赖即使没有显示引入,都会被动全部拥有,这样可以减少配置。典型的这些依赖有junit,sl4f等等。如mmorpg项目的父模块申明

subprojects {dependencies {testImplementation ("junit:junit:${junitVersion}")testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'}
}

3.3继承任务(task)

maven通过插件(plugin)来构建项目命令,而gradle通过任务(task)。task直接用脚本语言书写,不用封装,非常灵活。

maven的插件继承,子模块可以使用并覆写某些配置。而gradle的task继承更像OOP,子模块可以在子任务中使用父任务的属性和方法,例如通过super关键字来调用父任务的方法。使用如下:

1.在build.gradle文件中定义一个父任务(例如,名为parentTask),并为其添加所需的配置和行为。例如:

task parentTask {// 添加父任务的配置和行为doLast {println 'This is the parent task'}
}

 ​​​​​​2.在build.gradle文件中定义一个子任务(例如,名为childTask),并使用extends关键字继承父任务。例如:

task childTask(type: parentTask) {// 添加子任务的配置和行为doLast {println 'This is the child task'}
}

四、模块化的聚合效果

在Gradle中,聚合是指将多个子项目合并为一个大项目进行构建。聚合可以帮助您管理包含多个相关项目的大型代码库。以下是如何在Gradle中进行聚合的步骤:

创建一个父项目文件夹,并在该文件夹下创建一个settings.gradle文件。添加需要聚合的子模块,例如mmorpg的配置

rootProject.name = 'mmorpg'include 'game-common', 'game-protocol', 'game-net', 'game-data-starter','game-server','game-mq', 'game-rpc'

在父项目文件夹中运行Gradle命令,例如gradle build。Gradle将会自动聚合并构建父项目及其所有子项目。

五、重命名子模块的脚本名称

maven使用pom.xml来构建管理任务,不管是父模块还是子模块,都是一样的名字,这样在查找文件的时候不够方便。而Gradle则运行给子模块重命名。在setting.gradle下输入以下命令

// 修改子项目的build文件名,重名很难查找
rootProject.children.each {it.buildFileName = it.name - "game-" + ".gradle"
}

每个子模块独立名字 

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

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

相关文章

Elastic Stack--07--JavaAPI----文档(新增 、修改 、 查询 、 删除)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JavaAPI-文档1.新增 Insert2.修改 Update3.查询 Get4.删除 Delete5.批量操作 BulkRequest批量新增批量删除 高级查询1.查询所有索引数据2.条件查询3.分页查询4.查询…

华容道问题求解_详细设计(五)之hash值和回放功能

(续上文) 布局的hash 值计算 笔者也参考了之前的一些文章,很多文章提到了怎么节省存贮空间来查找最优解,这不是笔者的目的。笔者的目的比较单一,就是找到最优解就行了。因此并没有在存贮上面进行过多的优化&#xff…

网络学习:数据的封装与解封装

目录 一、数据的封装与解封装 1. 数据的封装过程 2. 数据的解封装过程 二、数据的传输过程 1. 相关概念 2. 网络传输过程中数据封装和解封装模拟 一、数据的封装与解封装 1. 数据的封装过程 数据封装过程,在这里我们举例说明,以两台主机的通信为…

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年?2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

记录西门子:IO隔离SCL编程

在PLC变量中创建IO输入输出 在PLC类型中创建输入和输出,并将PLC变量的输入输出名称复制过来 创建一个FC块或者FB块 创建一个DB块 MAIN主程序中:

C语言程序与设计——函数(二)递归练习

在上一篇文章中接触到了递归这种编程方法,下面我们将用几个程序加深以下对递归的理解。 递归实际上就是程序调用自身的编程技巧 递归程序的组成: 边界条件处理针对于问题的处理过程和递归过程结果返回 二分查找 首先分析二分查找的查找逻辑: …

深入理解操作系统Operator System(2)

目录 操作系统对上的管理 系统调用接口 用户操作接口(库函数) 系统调用和库函数的概念 结构层次示意图 总结 为什么要有操作系统❓ 上次主要介绍了操作系统的"管理"和操作系统对下的管理。本篇主要是对上的管理。 操作系统对上的管理 …

【最新版】ChatGPT/GPT4科研应用与AI绘图论文写作(最新增加Claude3、Gemini、Sora、GPTs技术及AI领域中的集中大模型的最新技术)

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框,使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…

谨慎购买:腾讯云轻量应用服务器限制“月流量”!

腾讯云轻量应用服务器限制月流量,买前必须知道的限制月流量说明,腾讯云百科txybk.com以2核4G5M轻量应用服务器为例,在腾讯云优惠活动 https://curl.qcloud.com/oRMoSucP 这台轻量服务器仅售165元,活动打开如下图: 轻量…

深入理解JavaScript内存泄漏:原因与解决方法

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Leetcode 59.螺旋矩阵Ⅱ

1.题目 2.思路 (借用代码随想录的图) 1.我们将转一圈看作一个循环(1->2->3->4->5->6->7->8 这是一个循环) 2.在这个循环里,我们要画四条边(上右下左) 填充上行从左到右 填…