6.Gradle多模块项目

假设有一个项目,它由3个模块组成:model、repository、web;

三个模块之间的依赖关系是:web -> repository -> model

1. Settings

settings文件声明了所需的配置来实例化项目的层次结构。在默认情况下,这个文件被命名为 settings.gradle,并且和根项目的build.gradle文件放在一起。

1.1 settings文件

下面的清单显示了 settings 文件的内容。若想使每个子项目都成为构建的一-部分,则可以调用带有项目路径参数的 include 方法。

settings.gradle

// 将给定的子项目添加到构建中,传给include方法的参数是项目路径,不是文件路径
include 'model'
// 将项目的字符串数组传给方法调用,而不是为每个单独的子项目调用include方法
include 'repository', 'web'

1.2 settings api

Gradle组装构建之前,它会创建- - 个Settings类型的实例。Settings 接口是settings文件的直接表示。它的主要作用是添加Project实例参与多项目构建。
除了组装多项目构建之外,你可以在build.gradle脚本中做任何事情,因为你可以直接访问Gradle和Project接口。下图显示了Settings接口的相关方法及其联系。

image-20200718200953963

1.3 settings 执行

image-20200718201046536

2. 配置子项目

2.1 Project API

为了声明特定的项目构建代码,使用了project方法。至少必须提供项目路径(例如,:model)。

很多时候,你想要为所有的项目或只有子项目定义一些公 共的行为。为实现这些用例,Project API提供了两个专门的方法: allprojects和subprojects.假设你想要把Java插件应用到所有子项目中,因为你需要编译Java源代码。你可以通过在subprojects闭包参数中定义代码来实现。

在多项目构建中项目的默认执行顺序是基于它们的字母名称的。为了显式地控制在构建生命周期的配置阶段的执行顺序,你可以使用项目执行方法 evaluationDependsOn和evaluationDependsOnChildren。对于需要确保为一个项目设置的属性可以被其他项目使用的情况尤其如此。

image-20200718201332473

2.2 定义特定行为

可以通过 project 方法来定义特定的项目行为。为了给三个子项目 model、repository、web 搭建构建基础环境,你需要为它们分别创建--个项目配置块。下面的清单显示了在 build.gradle 文件中的项目定义。

build.gradle

ext.projectIds = ['group': 'com.manning.gia', 'version': '0.1']

group = projectIds.group
version = projectIds.version

project(':model') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
}

project(':repository') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
}

project(':web') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
    apply plugin: 'war'
    //apply plugin: 'jetty'

    repositories {
        mavenCentral()
    }

    dependencies {
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }
}

2.3 项目间依赖

project(':model') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
}

project(':repository') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'

    dependencies {
        compile project(':model')
    }
}

project(':web') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
    apply plugin: 'war'
    //apply plugin: 'jetty'

    repositories {
        mavenCentral()
    }

    dependencies {
        compile project(':repository')
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }
}

2.4 多项目部分构建

拥有几十个甚至上百个依赖的子项目的复杂多项目构建,将大大影响平均执行时间。Gradle 会遍历所有的项目依赖并确保它们是最新的。在开发阶段,通常知道在什么子项目中哪些源文件发生了变化。从技术上讲,不需要重新构建没有发生变化的子项目。

针对这些情况,Gradle 提供了部分构建特性。部分构建是通过命令 行选项- a 或 --no-rebuild 启用的。假设在子项目 repository 中只改变了 代码,但不想重新构建子项目 model。通过使用部分构建,可以省去检查子项目model的成本并且降低构建执行时间。如果你正工作在-一个拥有上百个子项目依赖的企业级项目中,你会感激在执行构建时节省的每一秒。

gradle :repository:build -a

image-20200718202923606

gradle :repository:buildNeeded

image-20200718203013571

2.5 跨项目task

假设在根项目和子项目中定义了一个名为 hello 的 task

build.gradle

ext.projectIds = ['group': 'com.manning.gia', 'version': '0.1']

group = projectIds.group
version = projectIds.version

task hello {
    doLast {
        println 'Hello from root project'
    }
}

project(':model') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'

    task hello {
        doLast {
            println 'Hello from model project'
        }
    }
}

project(':repository') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'

    dependencies {
        compile project(':model')
    }

    task hello {
        doLast {
            println 'Hello from repository project'
        }
    }
}

project(':web') {
    group = projectIds.group
    version = projectIds.version
    apply plugin: 'java'
    apply plugin: 'war'

    repositories {
        mavenCentral()
    }

    dependencies {
        compile project(':repository')
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }
}

image-20200718203415216

控制task执行顺序

task hello {
    doLast{
        println 'Hello from root project'
    }
}

project(':model') {
     //...
    task hello(dependsOn: ':repository:hello') {
        doLast{
            println 'Hello from model project'
        }
    }
}

project(':repository') {
    //...
    dependencies {
        compile project(':model')
    }

    task hello {
        doLast{
            println 'Hello from repository project'
        }
    }
}

2.6 定义公共行为

allprojects {
    group = 'com.manning.gia'
    version = '0.1'
}

subprojects {
    apply plugin: 'java'
}

project(':repository') {
    dependencies {
        compile project(':model')
    }
}

project(':web') {
    apply plugin: 'war'
    apply plugin: 'jetty'

    repositories {
        mavenCentral()
    }

    dependencies {
        compile project(':repository')
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }
}

2.7 每个项目创建构建文件

image-20200718203945699

root -> build.gradle

allprojects {
    group = 'com.manning.gia'
    version = '0.1'
}

subprojects {
    apply plugin: 'java'
}

model-> build.gradle

repository-> build.gradle

dependencies {
    compile project(':model')
}

web-> build.gradle

apply plugin: 'war'
//apply plugin: 'jetty'

repositories {
    mavenCentral()
}

dependencies {
    compile project(':repository')
    providedCompile 'javax.servlet:servlet-api:2.5'
    runtime 'javax.servlet:jstl:1.1.2'
}

3. 参考

  1. 《实战Gradle 中文版》
原文地址:https://www.cnblogs.com/col-smile/p/13339480.html