Gradle 教程

Gradle 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/gradle-multi-project-build.html

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 多模块(多项目)的配置文件主要有 3 个:

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

settings.gradle 配置

settings.gradle 是 Gradle 构建工具的配置文件之一,用于配置 Gradle 的全局设置以及多项目构建。在该文件中,可以定义项目的名称、子项目、Gradle 插件、Gradle 版本等设置。如果存在多个 Module,可以在此处配置所有的 Module 项目。

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

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

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
        // 其他插件仓库
    }
    plugins {
        id 'com.example.plugin' version '1.0.0'
        // 其他插件及其版本
    }
}

dependencyResolutionManagement {
    repositories {
        mavenCentral()
        // 其他依赖仓库
    }
}

配置项详解:

  • rootProject.name :设置项目的名称。

  • include :包含子项目。例如,如果你的子目录有一个名为 app 的子项目,可以使用 include ':app' 来包含它。

    你会发现该配置项值有的存在冒号前缀,有的值不存在冒号,带有冒号的形式表示子项目的路径,而不带冒号的形式表示子项目的名称。冒号是用于指定项目路径的分隔符。例如,如果你有一个多层次的项目结构,你可以使用冒号来指定子项目的路径。这对于组织大型项目或多模块项目非常有用。

    如果项目是多层次的,需要使用冒号来指定子项目的路径。

    include 命令也可以用逗号隔开一次性指定所有导入模块,如下:

    include ':client',
        ':push',
        ':uikit',
        ':mars-core-release',
        ':webrtc',
        ':badgeview',
        ':uvccamera',
        ':emojilibrary',
        ':imagepicker',
        ':pttclient',
        ':avenginekit'
  • pluginManagement :该块用于配置和管理插件的版本。

    允许在项目中的任何位置声明插件及其版本,而不需要在每个子项目中重复声明。

    通过这种方式,你可以确保项目中使用的插件版本是一致的,而且可以轻松地对所有插件进行统一的升级或更改。

  • dependencyResolutionManagement :该块用于配置和管理整个项目的依赖版本。

    允许中心化管理项目中使用的所有依赖的版本信息,以确保版本的一致性。

    可以在这里定义依赖的版本,然后在各个子项目中引用这些版本而无需在每个子项目中单独声明版本。

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

每个 Gradle 项目都有一个 build.gradle 构建脚本配置,每个 build.gradle 都是 org.gradle.api ...
Flask和Django都是流行的PythonWeb框架,它们在不同的应用场景中有着各自的优势和特点。*如果你的项目较为复杂,需要强大的内置 ...
url_for()函数对于动态构建特定函数的 URL 非常有用。该函数接受函数的名称作为第一个参数,并接受一个或多个关键字参数,每个参数对应 ...
在Django中,模块(Module)通常指的是一个功能相关的代码集合,旨在提供一种组织和管理代码的方式。作用:Django应用的主要作用是 ...
假设您已经创建了一个Django项目,并在其中创建了一个用于身份验证的应用程序。###自定义认证表单创建一个自定义的认证表单来定制登录过程, ...