Gradle 教程

Gradle 笔记

Gradle 多模块构建


Gradle 可以支持多模块(项目)构建。多个模块(项目)之间需要将公用的配置抽取到全局,子项目中只写差异化的配置,以便于维护。

多模块(项目)的 Gradle 目录结构

以项目 search 为示例,需要有一个 search-common 模块用于公用代码,一个 search-rest 模块用于提供 rest 接口,search-rest 依赖 search-common,如果用 gradle 构建,目录树会是如下形式:

search
├── build.gradle       -- 全局配置
├── settings.gradle    -- 全局配置
├── search-common      -- 子模块1目录
│   └── src            -- 子模块1 src 目录
│       └── main
│   └── build.gradle   -- 子模块1配置
├── search-rest        -- 子模块2配置
│   └── src            -- 子模块2 src 目录
│       └── main
│   └── build.gradle   -- 子模块2配置
...

这种构建有各种形状和大小,但它们都有一些共同的特点:

  • 在项目的根目录或主目录中都有一个 settings.gradle 文件。
  • 根目录或主目录都有一个 build.gradle 文件。
  • 具有自己的 build.gradle 构建文件的子目录(某些多项目构建可能会省略子项目构建脚本)。

全局 Gradle 配置

Gradle 多模块(多项目)的配置文件分为2个:

  • settings.gradle 文件配置。
  • build.gradle 脚本配置。

settings.gradle 配置

settings.gradle 中的结构定义如下:

rootProject.name = 'search'     -- 根项目名称
include 'search-common'         -- 子模块(项目)名称
include 'search-rest'           -- 子模块(项目)名称

build.gradle 配置

全局 build.gradle 中可以定义全局公用的构建配置,以 Spring Boot 项目配置示例:

//  groovy 脚本本身的依赖配置
buildscript {
    //  jcenter 仓库、maven 仓库等依赖仓库配置
    repositories {
        jcenter()
        mavenLocal()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'http://repo.spring.io/snapshot' }
        maven { url 'http://repo.spring.io/milestone' }
        mavenCentral()
    }
    //  ext 对象中属性相关配置
    ext {
        springBootVersion = '2.0.6.RELEASE'
        springGradleVersion = '1.0.5.RELEASE'
    }
    //  依赖组件配置
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:${springGradleVersion}"
    }
}

//  所有模块(项目)的通用配置
allprojects {
    group 'com.demo.search'
    version '1.0-SNAPSHOT'
    apply plugin: 'idea'
}

//  子模块(项目)的统一配置
subprojects {
    apply plugin: 'java'
    //  指定 JDK 版本
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    //  指定编码格式
    [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
    repositories {
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    }
    //  ext 对象中属性相关配置
    ext {
        springBootVersion = "2.0.6.RELEASE"
        fastjsonVersion = "1.2.54"
    }
    dependencies {
        compile("javax.servlet:javax.servlet-api:4.0.1")
        compile("com.alibaba:fastjson:$fastjsonVersion")

        //  单元测试
        testCompile("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
        testCompile("junit:junit:4.12")
    }
    configurations {
        //  移除 spring boot 默认 logger 依赖
        all*.exclude module: 'spring-boot-starter-logging'
    }
}