现在很多复杂的项目从maven构建转为gradle的构建,具体性能对比可以查找资料说明。这里来说明一个多层级的父子项目使用gradle构建情况:

 直接上图上码来说明:

例如项目结构如下图:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_项目构建

      

则在Settings.gradle中设置如下:

rootProject.name = 'xxl-job'
 include ':xxl-job-core'
 include ':xxl-job-admin'
 include ':xxl-job-executor-sample-springboot'project(':xxl-job-core').projectDir = "$rootDir/xxl-job-core" as File
 project(':xxl-job-admin').projectDir = "$rootDir/xxl-job-admin" as File
 project(':xxl-job-executor-sample-springboot').projectDir = "$rootDir/xxl-job-executor-samples/xxl-job-executor-sample-springboot" as File

 

具体原理看Settings.gradle的解析说明:

Gradle对构建模块化项目提供了强大的支持,在Gradle中每一个模块都是一个项目,称之为Gradle多项目构建技术,多项目构建实现了项目模块化,降低代码耦合度,增加内聚性,本篇文章将简单介绍如何使用Gradle进行多项目构建。

 

1、组装多项目构建

Gradle整个项目是由一个根目录和多个模块的子目录构成,在根目录下新建build.gradle构建脚本,使用gradle projects命令查看所有参与构建的项目:


 


1. > Task :projects 
2. //只有一个根项目,无子项目
3. ------------------------------------------------------------
4. Root project
5. ------------------------------------------------------------
6. Root project 'root'
7. No sub-projects

示例中使用的多项目层次结构如下图,定义了3个子项目:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_Gradle_02


①settings文件介绍:使用过Gradle构建项目的都应该知道这个文件,该文件声明了项目层次结构所需的配置。默认情况下,这个文件被命名为settings.gradle,并且和根项目的build.gradle文件放在一起。简单配置settings.gradle文件:

 


1. //settings.gradle脚本:
2. include 'model'
3. include 'repository', 'web'
4.  
5. //再次运行gradle projects命令,可以看出多了3个子项目:
6. > Task :projects 
7. ------------------------------------------------------------
8. Root project
9. ------------------------------------------------------------
10. Root project 'root'
11. +--- Project ':model'
12. +--- Project ':repository'
13. \--- Project ':web'

②settings API的理解:Gradle在组装构建之前,会创建一个Settings实例,Settings接口是settings文件的直接表示,它的主要作用就是添加Project实例参与多项目构建,下图显示了Settings接口的相关方法:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_文件名_03


我们可以在settings.gradle文件中直接使用这些相关的API进行编码,例如调用了include(String)方法将子项目添加到多项目的构建中。

③settings执行的阶段:在介绍task的使用时说到了构建过程的三个生命周期:初始化、配置和执行。那么是在哪个阶段解析执行settings文件中的代码的呢?可以想到的是,它肯定是在Project实例配置之前进行实例化的:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_gradle父子模块怎么实现三层架构_04


④如何找到settings文件:只要根项目或者任何子项目的目录中包含构建文件,Gradle就运行你从相应的位置运行构建。 Gradle是如何知道一个子项目是一个多项目构建的一部分的呢?它需要找到settings文件,这个文件指示了子项目是否包含在多项目构建中。步骤:①首先Gradle在与当前目录同层次的master目录下搜索settings文件,②找不到则在父目录下查找settings文件,下图分别对应这两种情况:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_文件名_05


⑤项目的两种布局:分层布局和平面布局,android项目中使用的就是分层布局。对于平面布局来说,要想包括与根项目同一嵌套层次的项目,需要使用includeFlat方法,下图分别对应的是分层布局和平面布局:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_Gradle_06


 

2、子项目的构建文件

每个子项目的构建需要在子项目的目录下新建一个build.gradle构建脚本,该目录树如下图:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_项目构建_07


①根项目构建脚本:

 

1. /**为所有项目(包括根项目和所有子项目)设置group和version属性*/
2. allprojects {
3. group = 'com.manning.gia'
4. version = '0.1'
5. }
6. /**所有子项目应用Java插件*/
7. subprojects {
8. apply plugin: 'java'
9. }

②子项目构建脚本:一般在子项目构建脚本中不声明任何代码也是可以的,除非有一些其它的需求,例如web子项目的构建脚本如下:


 

1. /**应用war插件*/
2. apply plugin: 'war'
3. /**声明中心仓库*/
4. repositories {
5. mavenCentral()
6. }
7. dependencies {
8. /**定义依赖了repository子项目*/
9. compile project(':repository')
10. }

3、定义不同的构建脚本名称

标准的Gradle构建文件名是build.gradle,但是也许有必要使用一些更具有表达性的名称来命名构建文件。想使用自定义的构建脚本文件名,关键在于settings文件。假如项目结构如下图:

gradle父子模块怎么实现三层架构 gradle 父子项目依赖_文件名_08


 

1. include 'todo-model', 'todo-repository', 'todo-web'
2.  
3. /**更改构建文件,将build.gradle 更换成更有意义的命名,如 model.gradle
4. * it.name 是子项目名:todo-model todo-repository todo-web*/
5. rootProject.children.each {
6. /**设置构建脚本文件名*/
7. it.buildFileName = it.name + '.gradle' - 'todo-'
8. }

以上简单介绍多项目构建的原理,settings文件如何实现基本的配置,如何是一个项目作为子项目添加到构建中等。还是那句话,知其所以然能够让你得心应手。