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"
}

每个子模块独立名字 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【安装教程】windows下安装Faiss-GPU

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 【安装教程】windows下安装Faiss-GPU 查看安装指令 查看安装指令 登录网站:https://anaconda.org/ , 然后搜索faiss-gpu会进入如下界面,或…

Vue 3中的reactive:响应式状态的全面管理

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

讲解Python3内置模块之json编码解码方法

简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成&#…

web前端框架

目前比较火热的几门框架: React React是由Facebook(脸书)开发和创建的开源框架。React 用于开发丰富的用户界面,特别是当您需要构建单页应用程序时。它是最强大的前端框架。 弊端: 您不具备 JavaScript 的实践知识,则建议不要使用 React。同样&#x…

MIT6.828LAB4 (3)

LAB3_Part B: Copy-on-Write Fork 文章目录 LAB3_Part B: Copy-on-Write Fork前言练习8练习9练习10练习11练习12总结 前言 记录一下自己的学习过程 实验内容翻译: https://gitee.com/cherrydance/mit6.828 该翻译仅供参考 练习8 实现sys_env_set_pgfault_upcall系统…

内存映射mmap拓展

第一个是上一篇博客中用mmap实现任意两个进程间相互通信,前几篇博客也用管道实现了进程间通信 这里有个问题,管道是基于缓冲区环形队列的,实验也表明读过的数据不能在读利用命名管道实现任意进程间的通信 那么mmap多个读写操作时会是什么情况…

关于GPU显卡的介绍

一.关于英伟达历代产品架构 显卡是一种计算机硬件设备,也被称为显示适配器或图形处理器。目前的硬件部分主要由主板、芯片、存储器、散热器(散热片、风扇)等部分。显卡的主要芯片是显卡的主要处理单元。显卡上也有和计算机存储器相似的存储器&#xff0…

Mysql数据库-基本表操作

1.表操作 创建表:CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集&#xff…

python学习笔记------集合(set)

集合定义格式 基本语法: #定义集合字面量 {元素,元素,元素......,元素} #定义集合变量 变量名称{元素,元素,元素......,元素} #定义空集合 变量名称set() #定义集合字面量 {元素&#…

【AI辅助研发】-趋势:大势已来,行业变革

【AI辅助研发】-趋势:大势已来,行业变革 引言 在科技日新月异的今天,人工智能(AI)技术已逐渐渗透到各行各业,其中软件研发行业更是受益匪浅。AI辅助研发已成为大势所趋,不仅提高了软件开发的效…

登录凭证------

为什么需要登录凭证? web开发中,我们使用的协议http是无状态协议,http每次请求都是一个单独的请求,和之前的请求没有关系,服务器就不知道上一步你做了什么操作,我们需要一个办法证明我没登录过 制作登录凭…

免费无水印视频素材哪里下载?这几个地方您要知道

哟哟,切克闹,视频剪辑达人们,是不是在视频素材的海洋里迷航了?别着急,今天我就给大家分享几个超实用的无水印短视频素材合集网,让你的创作更加得心应手,从此素材不再是你的烦恼 1,蛙…

鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

WebGL的全称为Web Graphic Library(网页图形库),主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES,可以在HTML5的canvas元素对象中使用,无需使用插件,支持跨平台。WebGL程序是由JavaScr…

Hudi入门

一、Hudi编译安装 1.下载 https://archive.apache.org/dist/hudi/0.9.0/hudi-0.9.0.src.tgz2.maven编译 mvn clean install -DskipTests -Dscala2.12 -Dspark33.配置spark与hudi依赖包 [rootmaster hudi-spark-jars]# ll total 37876 -rw-r--r-- 1 root root 38615211 Oct …

【Python从入门到进阶】50、当当网Scrapy项目实战(三)

接上篇《49、当当网Scrapy项目实战(二)》 上一篇我们讲解了的Spider与item之间的关系,以及如何使用item,以及使用pipelines管道进行数据下载的操作,本篇我们来讲解Scrapy的多页面下载如何实现。 一、多页面下载原理分…

【Leetcode每日一刷】滑动窗口:209.长度最小的子数组

一、209.长度最小的子数组 1.1:题目 题目链接 1.2:解题思路 题型:滑动窗口;时间复杂度:O(n) 🪧 滑动窗口本质也是双指针的一种技巧,特别适用于字串问题 ❗❗核心思想/ 关键:左右…

A5自媒体wordpress主题模板

一个简洁的wordpress个人博客主题,适合做个人博客,SEO优化效果挺不错的。 https://www.wpniu.com/themes/204.html

前端学习之行内和块级标签

行内标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>span</title> </head> <body><!-- 行内标签特点&#xff1a;1、不换行,一行可以放多个2、默认宽度内容撑开代表&#…

谈谈我的自媒体创作真实感悟

因为我有数十款APP和小程序&#xff0c;基本都是些辅助内容创作的工具&#xff0c;于是我就顺水推舟做了几个自媒体账号&#xff1a;微信公众号&#xff0c;抖音&#xff0c;知乎&#xff0c;小红书&#xff0c;CSDN等&#xff0c;账号的名字都是全赞工程师。 目前这些号有收入…

分享一些实用性的大语言模型(GitHub篇)

1.多模态大模型 GitHub网址&#xff1a;haotian-liu/LLaVA&#xff1a;[NeurIPS23 Oral] 视觉指令调优 &#xff08;LLaVA&#xff09; 构建&#xff0c;旨在实现 GPT-4V 级别及以上的能力。 (github.com) 下面是LLaVA模型的介绍&#xff0c;作者都有一直维护和更新&#xff0c…