Background

通过IDEA创建一个Gradle Java项目,可以得到以下的目录结构:

gradle-project

  • gradle
    • wrapper
      • gradle-wrapper.jar
      • gradle-wrapper.properties
  • src
    • main
      • java
      • resources
    • test
      • java
      • resources
  • build.gradle
  • gradlew
  • gradlew.bat
  • settings.gradle

下面我们将逐步来了解该目录下与gradle相关的各个文件:


Wrapper

Wrapper是gradle推荐的构建方式,它是一个指定了gradle版本的脚本(具体可以查看gradle-wrapper.properties),可以帮助我们减少前期的配置工作,不必像maven一般需要手动去下载并配置环境变量。

其包含的文件如下(以下的文件对于一个通过git进行版本控制的项目来说是需要进行保存的):

  • gradle/wrapper/gradle-wrapper.jar: 用于下载gradle的jar包。
  • gradle/wrapper/gradle-wrapper.properties: 负责配置 Wrapper 运行时行为的配置文件,包括下载的gradle版本等。
  • gradlew, gradle.bat:用于使用 Wrapper 执行构建的 shell 脚本和 Windows 批处理脚本。

Settings

声明实例化和配置参与构建的Project实例的层次结构所需的配置。一个gradle项目,不管是单模块还是多模块,只能存在一个settings.gradle 文件(置于根目录),当gradle开始构建整个项目前,会通过该配置文件生成一个Settings实例。如果当前的项目没有settings.gradle 文件,gradle会将其当成单模块项目构建。

多模块构建

当创建一个gradle项目时,settings.gradle 会以当前文件所处的目录作为当前项目的根项目,当前目录的名称也会被当成根项目名称,如:

  1. rootProject.name = 'gradle-project'

如果想要在当前项目创建一些子模块的话,可以先创建一个子目录,并在子目录下创建一个build.gradle文件(具体可以参考下方多模块目录结构),再通过Settings.include(java.lang.String[])在settings.gradle中将子项目引入,最终gradle会将该子模块加入构建中,如:

  1. rootProject.name = 'gradle-project'
  2. include('gradle-sub-project') // 等同于 include 'gradle-sub-project'

多模块目录结构

gradle-project

  • gradle
    • wrapper
      • gradle-wrapper.jar
      • gradle-wrapper.properties
  • gradle-sub-project
    • src
      • main
        • java
        • resources
      • test
        • java
        • resources
    • build.gradle
  • build.gradle
  • gradlew
  • gradlew.bat
  • settings.gradle

build.gradle

gradle 构建的脚本,参与构建的模块应该存在其对应的build.gradle 脚本文件。

构建脚本的外部依赖项 buildscript

如果构建脚本时需要外部依赖、插件的辅助,可以通过buildscript 将其引入。

  1. buildscript {
  2. repositories {
  3. mavenCentral()
  4. }
  5. dependencies {
  6. classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
  7. }
  8. }

插件 plugins

gradle只是提供了一个自动化的流程,实际构建中所需要的功能,比如编译Java代码的能力,都是添加插件来达到的。

  • Gradle核心插件/可直接参与构建的插件(通过buildscript引入的插件)

    1. // plugins {
    2. // id «plugin id»
    3. // }
    4. plugins {
    5. id 'java'
    6. }
  • 二进制插件(需要被编译解析的插件)