Gradle--❤️‍依赖构建只会Maven?教你快速上手Gradle及多模块定制化方案❤️‍(非常实用,建议收藏)

举报
吾日三省贾斯汀 发表于 2021/09/27 18:47:59 2021/09/27
【摘要】 ❤️‍大家好,我是贾斯汀,欢迎进来学习啦~❤️‍【学习背景】相信做过实际项目或者学过项目的小伙伴,都听说过依赖构建工具,目前项目中用得最多的两种构建依赖构建方式分别是Maven和Gradle,至于哪种日出冲天,哪种日薄西山,这个说不准,我觉得现在实际上两种都使用得挺多的,只不过Maven出道得早一些,而Gradle是后起之秀,今天就来介绍一下这个后起之秀Gralde的使用,主要基于Sprin...
❤️‍大家好,我是贾斯汀,欢迎进来学习啦~❤️‍

【学习背景】

相信做过实际项目或者学过项目的小伙伴,都听说过依赖构建工具,目前项目中用得最多的两种构建依赖构建方式分别是MavenGradle,至于哪种日出冲天,哪种日薄西山,这个说不准,我觉得现在实际上两种都使用得挺多的,只不过Maven出道得早一些,而Gradle是后起之秀,今天就来介绍一下这个后起之秀Gralde的使用,主要基于Spring Boot官方提供的gradle demo进行说明,将教你如何快速上手一个Gradle工程,并根据实际需要进行单模块的配置以及多模块的配置,甚至是定制化多模块的配置方案,希望对你有所帮助,如果有疑问,记得在评论区留言~
在这里插入图片描述

进入正文~


@TOC

一、单模块

1.1 生成demo

直接通过SpringBoot官方快速创建一个demo工程 https://start.spring.io/
在这里插入图片描述

将demo工程导入IDEA或Eclipse等集成开发工具,得到的结构大致如下

demo
├─src
├─build.gradle
├─settings.gradle

在这里插入图片描述

1.2 gradle配置说明

关于Gradle依赖构建,我们主要关注build.gradlesettings.gradle这两个配置,配置说明如下:
settings.gradle

//Gradle工程名
rootProject.name = 'demo'

build.gradle配置内容及说明:

//依赖的插件
plugins {
	id 'org.springframework.boot' version '2.5.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}
//组名(前缀包名)
group = 'com.example'
//工程版本号(这里去掉-SNAPSHOT)
version = '0.0.1'
//JDK版本
sourceCompatibility = '1.8'

//全局仓库
repositories {
	//maven仓库中心
	mavenCentral()
}

dependencies {
	//依赖正式架包
	implementation 'org.springframework.boot:spring-boot-starter'
	//依赖测试架包(正式构建时不会加入到依赖中)
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	//Junit测试,Gradle 4.6及以上版本,加入该配置即自动支持
	useJUnitPlatform()
}

1.3 构建demo

完成Gradle的build.gradlesettings.gradle两个配置之后,接下来开始进行构建生成架包
如果没配置Gradle配置的,可以先安装Gradle(下载地址https://gradle.org/releases/)并配置一下,配置为 File -> Settings -> Build, Execution, Deployment -> Build Tools - Gradle
在这里插入图片描述
展开右侧Gradle视图栏,进行构建得到demo-0.0.1-plain.jar架包
在这里插入图片描述

二、传统多模块(多配置)

现在实际的很多工程,一般不只是单个工程单模块,很多都是需要配置多模块的,比较传统的方式是直接添加各个子模块,每一个子模块对应一个build.gradle配置,比较简单,但是配置可能会比较冗余,网上很少有说明怎么整合多模块的配置到一个build.gradle里面的教程,下一章会进行介绍并给出定制化的方案

2.1 添加子模块

直接基于上面Springboot生成的demo主工程,添加三个子模块
结构预览

demo
  ├─app_common
  │  └─build.gradle
  ├─app_one
  │  └─build.gradle
  ├─app_two
  │  └─build.gradle
├─build.gradle
├─settings.gradle

这种多模块创建方式比较简单,直接选中根目录demo,右键选择 New -> Module…
在这里插入图片描述
选中Gradle -> Java -> Next
在这里插入图片描述
命名要添加的子模块名称、填写GroupId/ArtifactId/Version三要素 -> Finish:
在这里插入图片描述
同理,将app_one、app_two另外两个子模块也创建出来即可

最终得到的工程结构如下图所示:
在这里插入图片描述
每一个子模块下的build.gradle跟主模块的结构是一样的
例如app_common/build.gradle配置如下:

plugins {
    id 'java'
}

group 'com.example'
version '0.0.1'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
    useJUnitPlatform()
}

主模块下的settings.gradle主要负载依赖其他子模块:

rootProject.name = 'demo'
include 'app_common'
include 'app_one'
include 'app_two'

2.2 构建单模块

同样的,完成多个子模块的创建后,测试一下Gradle构建单个模块是否正常
展开右边的Gradle -> app_common -> Tasks -> build -> jar,双击执行即可完成单模块的构建
在这里插入图片描述
最终得到app_common-0.0.1.jar单个构建包,一般生成在build的相关目录下:
在这里插入图片描述

2.3 构建多模块

也可以Gradle同时构建多个模块
展开右边的Gradle -> build -> jar,双击执行即可完成多模块的同时构建
在这里插入图片描述

三、定制多模块(单配置)

3.1 定制化说明

可以看到前面传统的多模块虽然创建简单,不过每一个子模块都需要维护一个build.gradle配置,对于实际应用来说,可能会比较繁琐了,因此可以考虑将多个子模块的配置整合到一个配置里面,这里本文做了一个定制化的配置,除了原有的build.gradlesettings.gradle两个配置文件之外,还新建了另外一个dependencies.gradle以及自定义template目录下相关的脚本

结构预览

springboot-gradle-demo
  ├─template
    ├─gradle
	  ├─v1
		├─build_java.gradle //bootjar、jar、war等构建方式定义
		├─buildscript.gradle //统一加载需要的插件
		├─functions.gradle //gralde定制化主函数配置
		├─junit.gradle //单元测试依赖的jdk版本、源码目录等
  ├─app_common
  ├─app_one
  ├─app_two
├─build.gradle //仓库定义、引用外部函数、插件以及依赖各个子模块定制化等
├─dependencies.gradle //根据名字可以看出主要用来进行依赖jar包用途
├─settings.gradle //主模块及子模块之间的include依赖

3.2 定制化配置

核心配置文件build.gradle、dependencies.gradle、settings.gradle及template配置内容及用途说明如下:
(1)settings.gradle配置及说明:

//Gradle主工程名
rootProject.name = 'springboot-gradle-demo'

//Gradle子模块名
include 'app_common','app_one','app_two'

(2)build.gradle配置及说明:

//==================定制化1:仓库、编译、插件、公共依赖start==================
buildscript {
	//全局声明变量
	ext {
		//maven公共仓库
		maven_public_repo_url="https://maven.aliyun.com/repository/public/"

		//gradle插件中心
		gradle_repo_url="https://plugins.gradle.org/m2/"

		//maven应用系统私有仓库
		//maven_private_dev_repo_url="https://maven.aliyun.com/repository/spring/"

		//DEV SNAPSHOTS依赖仓库
		//maven_snapshots_dev_repo_url="https://oss.sonatype.org/content/repositories/snapshots/"

		//插件目录(放在工程目录下,也可以单独存放到资源服务器,指定访问文件的具体url)
		template_dir="/template/gradle/v1"

		//编译目录(相对路径)
		output_dir="build"
	}

	//全局仓库: 自上而下寻找依赖
	repositories {
		//maven本地仓库: 优先加载
		mavenLocal()

		//maven仓库中心
		mavenCentral()

		//jcenter仓库中心
		//jcenter()和mavenCentral()是两个独立的仓库,两者毫无关系,jcenter()有的mavenCentral()可能没有,反之亦然。
		jcenter()

		//google仓库中心
		//google()

		//maven远程仓库: 阿里云或公司私服仓库
		maven {
			url = maven_public_repo_url
			url = gradle_repo_url
			//url = maven_private_dev_repo_url
			//url = maven_snapshots_dev_repo_url
		}
	}

	//全局公共依赖
	apply from: template_dir+'/buildscript.gradle',to: buildscript
}
//==================定制化1:仓库、编译、插件、公共依赖end==================

//Java插件: 未配置时api、implementation无法加载
plugins {
	id 'java'
	id 'java-library'
}

//==================定制化2:配置构建主入口、全局功能函数start==================
//自定义全局工具定制化: 自动构建主入口+配置全局功能函数
apply from: template_dir+'/functions.gradle'
//==================定制化2:配置构建主入口、全局功能函数end==================


//=======================定制化3:gradle子项目模块start=========================
//common project
project(':app_common'){
	apply from: '..'+template_dir+'/build_java.gradle'
	apply from: '..'+template_dir+'/junit.gradle'
}

//app_one project
project(':app_one'){
	apply from: '..'+template_dir+'/build_java.gradle'
	apply from: '..'+template_dir+'/junit.gradle'
}

//app_two project
project(':app_two'){
	apply from: '..'+template_dir+'/build_java.gradle'
	apply from: '..'+template_dir+'/junit.gradle'
}
//=======================定制化3:gradle子项目模块end=========================

//=======================定制化4:子项目定义依赖start=========================
apply from: 'dependencies.gradle'
//=======================定制化4:子项目定义依赖end=========================
//setSysSnapshotsRepo
//待扩展...


(3)dependencies.gradle配置及说明:

//========================Gradle工程子模块依赖jar包及版本控制=========================
//===========参数说明start=========
//api: 依赖暴露,其他模块都可见
//implementation: 表示依赖屏蔽,仅自己模块内可见
//===========参数说明end===========



//公共子模块依赖定义:app_common
project(':app_common'){//app_common公共项目子模块: 作为jar工程供其他子模块引用,其他无须重复定义相关jar包
	dependencies{
		//依赖仓库jar包
		api 'org.springframework.boot:spring-boot:2.4.3'
		api 'org.springframework.boot:spring-boot-starter-web:2.4.3'
		api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3'
		api 'mysql:mysql-connector-java:5.1.47'

		//依赖第三方jar包:指定工程资源lib目录下所有依赖包
		api fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

		//引入 mybatis-generator 插件
		//apply plugin: "com.arenagod.gradle.MybatisGenerator"

		//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
		testImplementation 'junit:junit:4.11'
	}
}

//独立子模块依赖定义: app_one
project(':app_one'){
	dependencies{
		//模块依赖: 指定某个模块进行依赖
		implementation project(':app_common')

		//依赖第三方jar包:指定工程资源lib目录下所有依赖包
	    compile fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

		//依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
		testImplementation (('org.springframework:spring-test:5.3.3')) {
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
		}

		//依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
		implementation (project(':app_common')) {
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
		}

		//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
		testImplementation 'junit:junit:4.11'
		testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
	}

	//依赖排除(全局级别):exclude的内容将不会被该jar包引用,PS: 当要排除的依赖范围很广时,可采用该方式
	configurations.all {
		exclude group: 'org.springframework', module: 'spring-core'
	}
}

//独立子模块依赖定义: app_two
project(':app_two'){
	dependencies{
		//模块依赖: 指定某个模块进行依赖
		implementation project(':app_common')

		//依赖第三方jar包:指定工程资源lib目录下所有依赖包
		compile fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

		//依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
		testImplementation (('org.springframework:spring-test:5.3.3')) {
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
		}

		//依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
		implementation (project(':app_common')) {
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
			exclude group: 'org.springframework', module: 'mock'
		}

		//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
		testImplementation 'junit:junit:4.11'
		testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
	}

}


(4)template下的相关组件及函数
除了template/gradle/v1/functions.gradle这段内容中的包名com.justin需要改成自己的之外,其他可以可以不需要动

		//deploy package dir of the project (sub-dir of output-dir)
		setSysPrivateRepo = { sys_id ->
			allprojects{
				repositories{
					maven {
						url maven_private_dev_repo_url
						content { includeGroupByRegx "com\\.justin\\."+sys_id+".*" }
					}
				}
			}
		}

3.3 构建多模块(定制化)

同样整合了多个子模块的配置进行几种管理之后,跟前面一样,可以通过Gradle视图栏,对多个模块或者单个模块进行构建,生成得到jar、bootjar、war等格式的架包

在这里插入图片描述

如果大家有需要将多个模块的配置整合到一个配置里面进行管理的需求,可以根据本文提供的spring-boot-demo示例工程进行修改,来实现自己工程的定制化多模块配置的统一管理~

最后,附上spring-boot-demo工程的GitHub源码下载地址:https://github.com/JustinJava/springboot-gradle-demo

或者CSDN下载地址:https://download.csdn.net/download/JustinQin/23279945


❤️‍原创不易,觉得有用的小伙伴点亮⭐收藏,支持一下吧!❤️‍

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。