daicy
发布于 2020-04-19 / 1461 阅读
0
0

Gradle: build.gradle vs. settings.gradle vs. gradle.properties

1. Overview

在本文中,我们将研究Gradle Java项目的不同配置文件。另外,我们将看到实际构建的细节。

您可以查看 Gradle简介以获得Gradle的一般介绍。

2. build.gradle

假设我们只是通过运行gradle init –type java-application创建一个新的Java项目。这将为我们提供一个具有以下目录和文件结构的新项目:

build.gradle
gradle    
    wrapper
        gradle-wrapper.jar
        gradle-wrapper.properties
gradlew
gradlew.bat
settings.gradle
src
    main
        java  
            App.java
    test      
        java
            AppTest.java

我们可以将build.gradle文件视为项目的心脏或大脑。本示例的结果文件如下所示:

plugins {
    id 'java'
    id 'application'
}
 
mainClassName = 'App'
 
dependencies {
    compile 'com.google.guava:guava:23.0'
 
    testCompile 'junit:junit:4.12'
}
 
repositories {
    jcenter()
}

它由Groovy代码或更准确地说由用于描述构建的基于Groovy的DSL(域特定语言)组成。我们可以在此处定义依赖关系,还可以添加诸如Maven存储库之类的用于依赖关系解析的内容。

Gradle的基本构建块是项目和任务。在这种情况下,由于应用了 Java插件,因此隐式定义了用于构建Java项目的所有必要任务。其中一些任务是assemble,check,build,jar,javadoc,clean等。

这些任务的设置方式也是如此,它们描述了Java项目的有用依赖关系图,这意味着通常足以执行构建任务,并且Gradle(和Java插件)将确保已执行所有必需的任务。

如果我们需要其他专门任务,例如构建Docker映像,它也将放入build.gradle文件中。任务的最简单定义如下所示:

task hello {
    doLast {
        println 'Hello Baeldung!'
    }
}

我们可以通过将任务指定为Gradle CLI的参数来运行任务,如下所示:

$ gradle -q hello
Hello Baeldung!

它不会做任何有用的事情,而是打印出“ Hello Baeldung!”。当然。

如果是多项目构建,我们可能会有多个不同的build.gradle文件,每个项目一个。

该的build.gradle文件针对执行项目实例,一个项目实例每个子项目创建。可以在build.gradle文件中定义的上述任务作为Task对象集合的一部分驻留在Project实例中。任务本身由多个操作组成(作为有序列表)。

在前面的示例中,我们添加了一个Groovy闭包来打印“ Hello Baeldung!”。通过在hello Task对象上调用doLast(Closure action),可以将此列表移到此列表的末尾 。在Task执行期间,Gradle 通过调用Action.execute(T)方法按顺序 执行其每个Action。

3. settings.gradle

Gradle还会生成settings.gradle文件:

rootProject.name = 'gradle-example'

该settings.gradle文件是Groovy脚本也是如此。

与build.gradle文件相比,每个Gradle构建仅执行一个settings.gradle文件。我们可以使用它来定义多项目构建的项目。

此外,我们还可以将代码注册为构建的不同生命周期挂钩的一部分。

该框架要求 在多项目构建中存在settings.gradle,而对于单项目构建则是可选的。

在创建构建的Settings实例之后,通过对该文件执行文件并对其进行配置,来使用该文件。这意味着我们要在settings.gradle文件中定义子项目,如下所示:

include 'foo', 'bar'

创建构建时,Gradle 在Settings实例上调用void include(String…projectPaths)方法。

4. gradle.properties

Gradle 默认情况下不会创建gradle.properties文件。它可以位于不同的位置,例如在项目根目录中,GRADLE_USER_HOME内或-Dgradle.user.home命令行标志指定的位置中。

该文件由键值对组成。我们可以使用它来配置框架本身的行为,它是使用命令行标志进行配置的替代方法。

可能的键示例包括:

  • org.gradle.caching=(true,false)
  • org.gradle.daemon=(true,false)
  • org.gradle.parallel=(true,false)
  • org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)
    另外,您可以使用此文件将属性直接添加到Project对象,例如,具有名称空间的属性: org.gradle.project.property_to_set

另一个用例是指定JVM参数,如下所示:

org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

请注意,它需要启动JVM进程来解析gradle.properties文件。这意味着这些JVM参数仅影响单独启动的JVM进程。

5.简而言之(The Build in a Nutshell)

假设我们不将其作为守护程序运行,我们可以将Gradle构建的一般生命周期总结如下:

它作为新的JVM进程启动
它解析 gradle.properties文件并相应地配置Gradle
接下来,它为构建创建一个 Settings实例
然后,它根据Settings对象评估 settings.gradle文件
它根据配置的Settings对象创建Projects的层次结构
最后,它将针对其项目执行每个build.gradle文件

6. Conclusion

我们已经看到,不同的Gradle配置文件如何实现各种开发目的。我们可以根据项目的需要使用它们来配置Gradle构建以及Gradle本身。


评论