Gradle 笔记

via: https://tianyu94.com/2019/06/...
  • Make the impossible possible, make the possible easy, and make the easy elegant
  • Gradle is Groovy
  • Minimize Coupling, Maximize Cohesion

Task 任务

task helloWorld {
  doLast {
    println 'Hello world~'
  }
}
$ gradle -q helloWorld
Hello world~
-q quiet 只输出 task 的相关信息
  • 每个新建的 task 默认都是 DefaultTask 类,标准的 Task 实现。

结合函数方法

task startTask {
  doLast {
    hello()
  }
}

def hello() {
  println 'Hello~'
}
$ gradle startTask
Hello~

动态 task

3.times {
  task 'repeatTask$it' {
    println 'I am repeat task'
  }
}

// 指定此 task 需依赖 repeatTask0
task groupTherapy(dependsOn: repeatTask0)
$ gradle groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
$ gradle groupTherapy -x repeatTask1
:repeatTask0
I am repeat task
:repeatTask2
I am repeat task
-x 排除指定 task
$ gradle repeatTask0 groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
执行多个 task,且每个 task 仅执行一次

给现有的 task 添加动作

task printVersion {
  doFirst {
    println 'Version 0.1 in doFirst'
  }

  doLast {
    println 'Version 0.1 in doLast'
  }
}

printVersion.doFirst { println 'First action' }
printVersion.doLast {  println 'Last action' }
$ gradle printVersion
First action
Version 0.1 in doFirst
Version 0.1 in doLast
Last action

设置描述和分组

task myTask {
  group = 'group1'
  description = 'I am myTask of group1'
}
// or
task myTask(group: 'group1',
            description: 'I am myTask of group1') {
  // ...
}

依赖多个 task

task myTask(dependsOn: [otherTask1, otherTask2]) {
  // ...
}
注意,若执行 myTask,它依赖的 otherTask1 和 otherTask2 (除其本身有依赖关系外)并不会保证执行的先后顺序与代码顺序一致。这个特征可使多个 task 并行执行提高效率,或是忽略固定的顺序来保证代码的维护性和避免潜在的破坏

终结器 task (finalizer task)

task task1 {
  doLast { println 'task1' }
}

task task2 {
  doLast { println 'task2' }
}

task1.finalizedBy task2
$ gradle task1
task1
task2
若终结器 task 执行失败,则不会影响 Gradle 的 task 的执行进度

部分命令行选项

  • -? / -h / --help 打印帮助信息
  • -b / --build-file 指定构建文件 e.g. gradle -b my.gradle
  • --offline 使用缓存离线构建
  • -q / --quiet, -w / --warning, -i / --info, -d / --debug 日志等级
  • s / --stacktrace 打印简要堆栈跟踪
  • S / --full-stacktrace 打印所有堆栈跟踪

帮助 task

  • tasks 显示项目可运行的 task,-a / --all 显示全部 task
  • properties 显示项目中可用属性

插件

使用 Java 插件

apply plugin: 'java'

使用 War 插件

apply plugin: 'war'

// 部分自定义属性设置
webAppDirName = 'mywebfiles' // 指定Web应用的源代码路径
war {
  // 将 mydir1,mydir2 路径添加到 war 文件的根目录下
  from 'mydir1'
  from 'mydir2'
}

使用 Jetty 插件

// 在 Gradle 4.0 之前可用
apply plugin: 'jetty'

// 在 Gradle 4.0 之后 jetty 插件已移除,替换为 Gretty
// 其他引用方法见官网:https://gretty-gradle-plugin.github.io/gretty-doc/Getting-started.html
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'

// Gretty 属性设置
// 详情见官网:https://gretty-gradle-plugin.github.io/gretty-doc/Gretty-configuration.html
gretty {
  httpPort = 8081 // 指定服务端口
  contextPath = '/MyWebApp' // 指定 url 根路径
  // ... many more properties
}

Gretty tasks

  • appRun / jettyRun 运行程序

属性

version = 0.1 // 设置项目版本
sourceCompatibility = 1.8 // 设置Java编译兼容版本为 1.8

jar {
  manifest {
    // 添加属性到 Jar 文件中
    attributes 'Main-Class': 'path.to.your.MainClass'
  }
}

sourceSets {
  main {
    java {
      // 自定义源代码路径,默认是 /src/main/java/
      srcDirs = ['your_src_dir_path']
    }
  }
  test {
    java {
      // 自定义测试代码路径,默认是 /src/test/java
      srcDirs = ['your_test_dir_path']
    }
  }
}

拓展属性

project.ext.myProp = 'hello'
// or
ext.myProp = 'hello'
// or
myProp = 'hello'

或者在 gradle.properties 文件中定义拓展属性

依赖

repositories {
    mavenCentral() // 使用 Maven Central 2 仓库
}

// 以下依赖存在多个重复,仅做示例
dependencies {
  // 编译使用
  compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
  // 简写形式,用冒号隔开
  compile 'org.apache.commons:commons-lang3:3.9'

  // 同 compile ,在 Gradle 5.x 后(建议)用此替换 compile
  implementation 'org.apache.commons:commons-lang3:3.9'

  // 编译时需要,在运行时由环境提供
  providedCompile 'javax.servlet:servlet-api:2.5'

  // 运行时提供
  runtime 'javax.servlet:jstl:1.1.2'
}

包装器

生成包装器

$ gradle wrapper
# 在构建脚本 build.gradle 旁会生成 gradle/wrapper/... 的包装器文件 *.jar 和 *.properties
# 同时生成 gradlew(for linux),gradlew.bat(for windows)

使用包装器

  • Windows: gradlew.bat ...
  • Linux: gradlew ...

定制包装器

task wrapper(type: Wrapper) {
  // 指定 Gradle 版本
  gradleVersion = '5.1.1'
  // 获取 Gradle 包的 url
  distributionUrl = 'http://mycustomserver.com/gradle/dists'
  // 包装器被解压后存放的相对路径
  distributionPath = 'gradle-dists'
}
笔记部分内容来源:Gradle in Action https://www.manning.com/books...

你可能感兴趣的:(gradle,groovy,java)