Skip to main content
 首页 » 编程设计

Gradle快速入门

2022年07月19日137dflying

Gradle快速入门

概述

Gradle是基于Groovy的基于java应用构建工具。按照过程请参考官网

构建块——项目和任务

在Gradle中,构建包括一个多个项目,每个项目有一个多个任务组成。
gradle中项目可以被打包成jar、war或zip文件。任务是一件单独的工作。可以包括编译类,或者创建和发布Java/web应用。简单的任务可以定义为:

task hello { 
    doLast { 
        println 'Baeldung' 
    } 
}

如果我们build.gradle目录下执行命令gradle -q hello,运行上面任务,在控制台中可以看到输出。

任务

gradle构建脚本完全是groovy语法:

task toLower { 
    doLast { 
        String someString = 'HELLO FROM BAELDUNG' 
        println "Original: "+ someString 
        println "Lower case: " + someString.toLowerCase() 
    } 
}

也可以定义任务依赖其他任务。语法为:dependsOn: taskName 。

task helloGradle { 
    doLast { 
        println 'Hello Gradle!' 
    } 
} 
 
task fromBaeldung(dependsOn: helloGradle) { 
    doLast { 
        println "I'm from Baeldung" 
    } 
}

给任务增加行为

定义任务是可以给其增加额外行为:

task helloBaeldung { 
    doLast { 
        println 'I will be executed second' 
    } 
} 
 
helloBaeldung.doFirst { 
    println 'I will be executed first' 
} 
 
helloBaeldung.doLast { 
    println 'I will be executed third' 
} 
 
helloBaeldung { 
    doLast { 
        println 'I will be executed fourth' 
    } 
}

doFirst和doLast动作分别增加在动作列表的顶部和底部,另外每个任务可以增加多次doFirst和doLast。

增加任务属性

可以给任务定义属性:

task ourTask { 
    ext.theProperty = "theValue" 
}

这里给outTask任务设置“theValue”属性。

管理插件

有两种类型的gradle插件——脚本代码和二进制形式。每个插件需要经历两个阶段:解析与应用。解析即发现合适的插件jar版本,并增加至项目类路径中。应用插件即在项目上执行Plugin.apply(T) 。

应用脚本插件

在aplugin.gradle中可以定义任务:

task fromPlugin { 
    doLast { 
        println "I'm from plugin" 
    } 
}

如果我们在我们的项目build.gradle文件中应用该插件,通过下面代码进行引用:
apply from: ‘aplugin.gradle’

现在执行 gradle tasks命令任务列表中应该显示“fromPlugin”任务。

通过二进制插件使用DSL

增加核心二进制插件,可以通过名称或ID:

plugins { 
    id 'application' 
}

现在,应该可以在项目中通过application plugin的run任务执行任何可运行jar。如果使用社区插件,需要提供完整插件id:

plugins { 
    id "org.shipkit.bintray" version "0.9.116" 
}

上述代码引用shipkit插件,其所有任务会出现在gradle的任务列表中。

DSL插件有一些限制:

  • 插件块中不支持Groovy脚本
  • 插件块需要在项目构建脚本的顶部(仅buildscripts{} 块可以在其之前)
  • DSL插件不能写在脚本插件、settings.gradle或初始化脚本中

DSL插件仍在孵化阶段,DSL和其他相关配置在未来gradle版本中可能会改变。

传统使用插件过程

使用“apply plugin”方式:

apply plugin: 'war'

如果你想使用社区插件,需要在buildscript{}块中 增加外部jar,然后可以在构建脚本中应用插件,但必须在任何已经存在的plugins{}块之后:

buildscript { 
    repositories { 
        maven { 
            url "https://plugins.gradle.org/m2/" 
        } 
    } 
    dependencies { 
        classpath "org.shipkit:shipkit:0.9.117" 
    } 
} 
apply plugin: "org.shipkit.bintray-release"

依赖管理

Gradle支持非常灵活的依赖管理系统,它与各种可用的方法兼容。
Gradle中依赖管理的最佳实践是版本控制、动态版本控制、解决版本冲突和管理传递依赖。

依赖配置

依赖被分为不同的配置组,每个配置有名称及依赖项。如果我们使用java插件,则会有compile, testCompile, runtime 配置可以给我们依赖进行分组。缺省配置扩展 runtime。

声明依赖

下面示例使用不同的方式增加(spring和Hibernate):

dependencies { 
    compile group:  
      'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE' 
    compile 'org.springframework:spring-core:4.3.5.RELEASE', 
            'org.springframework:spring-aop:4.3.5.RELEASE' 
    compile( 
        [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'], 
        [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE'] 
    ) 
    testCompile('org.hibernate:hibernate-core:5.2.12.Final') { 
        transitive = true 
    } 
    runtime(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') { 
        transitive = false 
    } 
}

上面代码通过不同的配置compile、testCompile、runtime进行依赖声明。有时需要依赖多个工件,我们也可以增加特定工件通过@extensionName(或ext方式):

runtime "org.codehaus.groovy:groovy-all:2.4.11@jar" 
runtime group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar'

这里我们使用@jar符合仅下载jar工件。

如果增加本地文件依赖,语法格式如下:

compile files('libs/joda-time-2.2.jar', 'libs/junit-4.12.jar') 
compile fileTree(dir: 'libs', include: '*.jar')

如果需要避免传递依赖,可以在配置级别或依赖级别进行配置:

configurations { 
    testCompile.exclude module: 'junit' 
} 
 
testCompile("org.springframework.batch:spring-batch-test:3.0.7.RELEASE"){ 
    exclude module: 'junit' 
}

多项目构建

构建声明周期

初始化阶段,gradle决定哪些项目参与多项目构建。一般在settings.gradle文件中定义,其位于根项目中,gradle也创建参与项目的实例。

在配置阶段,在配置阶段,所有创建的项目实例都需要基于Gradle特性配置进行配置。

最后在执行阶段,一组被创建和配置的任务开始执行。我们能在settings.gradle 和 build.gradle 文件中增加这三个阶段的代码。

settings.gradle :

println 'At initialization phase.'

build.gradle :

println 'At configuration phase.' 
 
task configured { println 'Also at the configuration phase.' } 
 
task execFirstTest { doLast { println 'During the execution phase.' } } 
 
task execSecondTest { 
    doFirst { println 'At first during the execution phase.' } 
    doLast { println 'At last during the execution phase.' } 
    println 'At configuration phase.' 
}

创建多项目构建

我们可以在根目录中执行gradle init 命令创建两个文件框架:settings.gradle 和 build.gradle .
根构建脚本生成一些通用配置:

allprojects { 
    repositories { 
        mavenCentral()  
    } 
} 
 
subprojects { 
    version = '1.0' 
}

setting文件中也需要博阿凯根项目和子项目:

rootProject.name = 'multi-project-builds' 
include 'greeting-library','greeter'

现在我们需要有两个子项目文件夹来演示多项目构建:’greeting-library’,’greeter’。每个子项需要有各自的构建脚本来排至各自依赖和其他必要的配置。

如果greeter项目依赖greeting-library项目,我们需要在greeter构建脚本中包括相应依赖。

dependencies { 
    compile project(':greeting-library')  
}

使用Gradle包装器

如果gradle项目有gradlew文件(linux为gradlew.sh,windows为gradlew.bat),我们不需要安装gradle去构建项目。

当执行gradlew构建项目(windows为 gradlew,linux为./gradlew),gradle特定发布包将被自动下载。通过下面脚本增加gradle包装器至项目中:

gradle wrapper --gradle-version 4.2.1

命令需要在根项目中执行,这将创建所有必要的文件和文件夹,以便将Gradle包装器与项目绑定在一起。另一种方法是将包装器任务添加到构建脚本中:

task wrapper(type: Wrapper) { 
    gradleVersion = '4.2.1' 
}

执行包装器任务将把我们的项目与包装器绑定在一起。除了gradlew文件之外,在gradle文件夹中还会生成一个包装器文件夹,其中包含一个jar和一个属性文件。

如果要切换到新版本Gradle,我们只需要修改grad-wrapper.properties中的内容。

总结

本文我们了解Gradle,相比其他构件工具更强大的版本冲突及传递依赖管理。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/81711782