Gradle 初学杂记

创建一个新的Gradle构建

## 在项目目录下执行次命令,一路回车后,将会生成一个简单的项目
gradle init

## 生成的目录结构
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

Gradle Wapper 是什么?为什么建议使用?怎么使用?
详见文档 《Gradle Wrapper

生成 java 标准目录结构

## --type参数支持的选项:
## 'basic', 'groovy-library', 'java-application', 'java-library', 'pom', 'scala-library'
gradle init --type java-library

## 生成 eclipse 项目配置文件
## 一般在根项目中定义插件,然后在项目根目录下执行,会自动对所有子项目进行处理
gradle eclipse
gradle eclipseWtp

## 生成 idea 配置
gradle idea

生成的 java 标准目录结构和 eclipse 配置

├─.settings
├─bin
│  ├─main
│  │  └─acme
│  │      └─demo
│  └─test
│      └─acme
│          └─demo
├─build
│  ├─classes
│  │  └─java
│  │      ├─main
│  │      │  └─acme
│  │      │      └─demo
│  │      └─test
│  │          └─acme
│  │              └─demo
│  ├─libs
│  ├─reports
│  │  └─tests
│  │      └─test
│  │          ├─classes
│  │          ├─css
│  │          ├─js
│  │          └─packages
│  ├─test-results
│  │  └─test
│  │      └─binary
│  └─tmp
│      ├─compileJava
│      ├─compileTestJava
│      └─jar
└─src
    ├─main
    │  ├─java
    │  │  └─acme
    │  │      └─demo
    │  └─resources
    └─test
        ├─java
        │  └─acme
        │      └─demo
        └─resources

简单的任务

  1. Copy – 将文件从一个位置复制到另一个位置(详见文档

build.gradle

task copyDocs(type: Copy) {
    from 'src/main/doc'
    into 'build/target/doc'
}

//for Ant filter
import org.apache.tools.ant.filters.ReplaceTokens

//for including in the copy task
def dataContent = copySpec {
    from 'src/data'
    include '*.data'
}

task initConfig(type: Copy) {
    from('src/main/config') {
        include '**/*.properties'
        include '**/*.xml'
        filter(ReplaceTokens, tokens: [version: '2.3.1'])
    }
    from('src/main/config') {
        exclude '**/*.properties', '**/*.xml'
    }
    from('src/main/languages') {
        rename 'EN_US_(.*)', '$1'
    }
    into 'build/target/config'
    exclude '**/*.bak'

    includeEmptyDirs = false

    with dataContent
}
  1. Zip – 将目录压缩成一个zip文件并输出

build.gradle

task zip(type: Zip) {
    from "src"
    setArchiveName "acme-1.0.zip"
}

常用命令

## 查看所有任务
gradlew tasks

## 查看项目属性
gradlew properties

创建多项目构建

多项目构建有助于模块化。它允许一个人专注于一个更大的项目中的一个工作区域,而项目其他部分的依赖交由Gradle负责。
项目详细配置见 《project api document

build.gradle


// 项目的名称 name 'acme' // 此项目的默认任务的名称。在启动构建时未提供任务名称时使用这些 defaultTasks "clean", "build" // 所有额外属性必须通过“ext”命名空间定义。一旦定义了额外的属性,它就可以直接在拥有对象上获得,并且可以读取和更新。只需要通过命名空间完成的初始声明。 ext { } // 应用于所有子项目和根项目的配置 allprojects { apply plugin: 'java' apply plugin: 'java-library' apply plugin: 'signing' // Jacoco 是一个免费的 Java 单元测试覆盖率分析工具,在 Gradle 中添加插件,在编译的同事进行单元测试覆盖率分析 apply plugin: 'jacoco' apply plugin: 'eclipse' apply plugin: 'eclipse-wtp' apply plugin: 'idea' jacoco { toolVersion = "$gradleJacocoVersion" } signing { required = isArtifactSigningRequired sign configurations.archives } // idea的一些配置 idea { module { downloadSources = false downloadJavadoc = false excludeDirs << file(".gradle") ["classes", "bin", "docs", "dependency-cache", "libs", "reports", "resources", "test-results", "tmp"].each { excludeDirs << file("$buildDir/$it") } } } // 分组 group = 'top.acme' // 版本号 version = '1.0' repositories { // 本地仓库 mavenLocal() // maven 仓库 mavenCentral() // jcenter 仓库 jcenter() } // 依赖 dependencies { // implementation 'com.google.guava:guava:26.0-jre' // Use JUnit test framework testImplementation 'junit:junit:4.12' } // 生成Java类的HTML API文档 // 参考:https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.tasks.javadoc.Javadoc.html javadoc { options.addBooleanOption('html5', true) failOnError = Boolean.getBoolean("ignoreJavadocFailures") excludes = ['**/generated/**'] } } // 应用于所有子项目的配置 subprojects { } // 这个项目的直接孩子 childProjects { }

settings.gradle

// 根项目的名称
rootProject.name = 'acme'

include 'project A'
include 'project B'
include 'project C'

通过遍历项目目录自动识别并生成 settings.gradle 配置

rootProject.name = 'acme'

FileTree buildFiles = fileTree(rootDir) {
    List excludes = gradle.startParameter.projectProperties.get("excludeProjects")?.split(",")
    include '**/*.gradle'
    exclude 'build', '**/gradle', 'settings.gradle', 'buildSrc', '/build.gradle', '.*', 'out'
    exclude '**/grails3'
    if(excludes) {
        exclude excludes
    }
}

String rootDirPath = rootDir.absolutePath + File.separator
buildFiles.each { File buildFile ->

    boolean isDefaultName = 'build.gradle'.equals(buildFile.name)
    if(isDefaultName) {
        String buildFilePath = buildFile.parentFile.absolutePath
        String projectPath = buildFilePath.replace(rootDirPath, '').replace(File.separator, ':')
        include projectPath
    } else {
        String projectName = buildFile.name.replace('.gradle', '');
        String projectPath = ':' + projectName;
        include projectPath
        def project = findProject("${projectPath}")
        project.name = projectName
        project.projectDir = buildFile.parentFile
        project.buildFileName = buildFile.name
    }
}

核心插件

// https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.Project.html#N1506F
apply plugin: 'java'
// https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.Project.html#N14F08
apply plugin: 'application'
// https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.Project.html#N1521A
apply plugin: 'war'
// https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.Project.html#N1504B
apply plugin: 'jacoco'
// https://docs.gradle.org/4.10-rc-2/dsl/org.gradle.api.Project.html#N151D2
apply plugin: 'signing'

apply plugin: 'eclipse'

apply plugin: 'eclipse-wtp'

apply plugin: 'idea'

发表评论

发表评论

*

沙发空缺中,还不快抢~