Java 插件给项目加入了一些属性 (propertiy).这些属性已经被赋予了默认的值,已经足够来开始构建项目了.如果你认为不合适,改变它们的值也是很简单的.让我们看下这个例子.这里我们将指定 Java 项目的版本号,以及我们所使用的 Java 的版本.我们同样也加入了一些属性在 jar 的清单里.例子 7.5. 定制 MANIFEST.MF 文件build.gradlesourceCompatibility = 1.
通常,一个 Java 项目有许多外部的依赖,既是指外部的 JAR 文件.为了在项目里引用这些 JAR 文件,你需要告诉 Gradle 去哪里找它们.在 Gradle 中,JAR 文件位于一个仓库中,这里的仓库类似于 MAVEN 的仓库.仓库可以被用来提取依赖,或者放入一个依赖,或者两者皆可.举个例子,我们将使用开放的 Maven 仓库:例子 7.3. 加入 Maven 仓库build.
Java 插件在你的项目里加入了许多任务.然而,你只会用到其中的一小部分任务.最常用的任务是 build 任务,它会建立你的项目.当你运行 gradle build 命令时,Gradle 将会编译和测试你的代码,并且创建一个包含类和资源的 JAR 文件:例子 7.2. 建立一个 Java 项目gradle build 命令的输出>
让我们先来看一个简单的例子.我们可以加加入下面的代码来使用 Java 插件:例子 7.1. 使用 Java 插件build.gradleapply plugin: 'java'这个例子的代码可以在 samples/java/quickstart 里找到, 二进制代码和源代码里都包含这些文件.它将会把 Java 插件加入到你的项目中,这意味着许多预定制的任务被自动加入到了你的项目里.
如你所见,Gradle 是一种多用途的构建工具.它可以在你的构建脚本里构建任何你想要实现的东西.但前提是你必须先在构建脚本里加入代码,不然它什么都不会执行.大都数 Java 项目是非常相像的:你需要编译你的 Java 源文件,运行一些单元测试,同时创建一个包含你类文件的 JAR.如果你可以不需要为每一个项目重复编写这些,我想你会非常乐意的.
Java 插件一个基础的 Java 项目多项目的 Java 构建
正如我们之后的详细描述 (参见第55章,构建的生命周期), Gradle 有一个配置阶段和执行阶段.在配置阶段后,Gradle 将会知道应执行的所有任务.Gradle 为你提供一个"钩子",以便利用这些信息.举个例子,判断发布的任务是否在要被执行的任务当中.根据这一点,你可以给一些变量指定不同的值.
Gradle 允许在脚本中定义一个或多个默认任务.例子 6.15. 定义默认任务build.gradledefaultTasks 'clean', 'run'task clean << { println 'Default Cleaning!'}task run << { println 'Default Running!'}task other << { println "I'm not a default task!"}gradle -q 命令的输出> gradle -qDefault Cleaning!
Gradle 能很好地衡量你编写脚本的逻辑能力. 首先要做的是如何提取一个方法.例子 6.14. 使用方法组织脚本逻辑build.gradletask checksum << { fileList('../antLoadfileResources').each {File file -> ant.checksum(file: file, property: "cs_$file.name") println "$file.name Checksum: ${ant.properties["cs_$file.
Ant 任务是 Gradle 的一等公民.Gradle 通过 Groovy 出色的集成了 Ant 任务.Groovy 自带了一个 AntBuilder.相比于从一个 build.xml 文件中使用 Ant 任务,在 Gradle 里使用 Ant 任务更为方便和强大. 从下面的例子中,你可以学习如何执行 Ant 任务以及如何访问 ant 属性:例子 6.13. 使用 AntBuilder 来执行 ant.loadfile 任务build.gradletask loadfile <<
你可以给任务加入自定义的属性.列如加入一个叫做 myProperty 属性,设置一个初始值给 ext.myProperty.然后,该属性就可以像一个预定义的任务属性那样被读取和设置了.例子 6.12. 给任务加入自定义属性build.gradletask myTask { ext.myProperty = "myValue"}task printTaskProperties << { println myTask.
正如同你已经在之前的示例里看到,有一个短标记 $ 可以访问一个存在的任务. 也就是说每个任务都可以作为构建脚本的属性:例子 6.11. 当成构建脚本的属性来访问一个任务build.gradletask hello << { println 'Hello world!'}hello.doLast { println "Greetings from the $hello.name task."}gradle -q hello 命令的输出> gradle -q helloHello world!
当任务创建之后,它可以通过API来访问.这个和 Ant 不一样.举个例子,你可以创建额外的依赖.例子 6.9. 通过API访问一个任务 - 加入一个依赖build.gradle4.times { counter -> task "task$counter" << { println "I'm task number $counter" }}task0.dependsOn task2, task3gradle -q task0 命令的输出>
Groovy 不仅仅被用来定义一个任务可以做什么.举个例子,你可以使用它来动态的创建任务.例子 6.8. 动态的创建一个任务build.gradle4.times { counter -> task "task$counter" << { println "I'm task number $counter" }}这里动态的创建了 task0, task1, task2, task3gradle -q task1 命令的输出> gradle -q task1I'm task number 1
就像你所猜想的那样,你可以声明任务之间的依赖关系.例子 6.6. 申明任务之间的依赖关系build.gradletask hello << { println 'Hello world!'}task intro(dependsOn: hello) << { println "I'm Gradle"}gradle -q intro 命令的输出> gradle -q introHello world!
Gradle 的构建脚本展示了 Groovy 的所有能力. 作为开胃菜, 来看看这个:例子 6.4. 在 Gradle 任务里使用 Groovybuild.gradletask upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase()}gradle -q upper 命令的输出>
有一种比我们之前定义的 hello 任务更简明的方法例子 6.3. 快捷的任务定义build.gradletask hello << { println 'Hello world!'}它定义了一个叫做 hello 的任务,这个任务是一个可以执行的闭包.我们将使用这种方式来定义这本指南里所有的任务.翻译者补充与前面的例子比较,doLast 被替换成了 <<.
你可以通过 gradle 命令运行一个 Gradle 构建.gradle 命令会在当前目录中查找一个叫 build.gradle 的文件.我们称这个 build.gradle 文件为一个构建脚本 (build script), 但是严格来说它是一个构建配置脚本 (build configuration script). 这个脚本定义了一个 project 和它的 tasks.让我们来先看一个例子,创建一个名为build.gradle的构建脚本.例子 6.
Gradle 里的任何东西都是基于这两个基础概念:projects ( 项目 )tasks ( 任务 )每一个构建都是由一个或多个 projects 构成的.一个 project 到底代表什么依赖于你想用 Gradle 做什么. 举个例子,一个 project 可以代表一个 JAR 或者一个网页应用. 它也可能代表一个发布的 ZIP 压缩包,这个 ZIP 可能是由许多其他项目的 JARs 构成的.
这一章主要讲解以下内容Projects 和 tasksHello world快捷的任务定义构建脚本代码任务依赖动态任务使用已经存在的任务快捷注释附加的 task 属性使用 Ant 任务使用方法默认的任务通过 DAG 配置
关注时代Java