gradle基础

来源:互联网 发布:遇害求救 知乎 编辑:程序博客网 时间:2024/06/05 04:50

安装

1、确保已经安装jdk,用java -version判断一下
2、从Gradle官网下载并进行解压
- 配置环境变量,GRADLE_HOME
- 添加到path,%GRADLE_HOME%\bin;
- 验证是否安装成功,gradle -v
官网下载Binary-only和Complete (with docs and sources)都可以。

gradle工程目录结构

与maven的工程目录结构一样
这里写图片描述

构建脚本概要

Gradle构建中的两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保它们的执行顺序。
这里写图片描述
project1依赖于project2,project1中taskA依赖于taskB和taskC,所以taskB和taskC执行完后才执行taskA。

项目(project)

一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用

三个重要的属性–group、name、version– 对应maven中的坐标(groupId、artifactId、version),注(build.gradle中有group和version,而name在settings.gradle中)
重要的方法–apply、dependencies、repositories、task
属性的其他配置方式:ext、gradle.properties

任务

任务对应org.gradle.api.Task。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件。

重要方法
- dependsOn –任务依赖
- doFirst、doLast – task也是一个动作列表,doFirst在任务动作列表之前添加一个动作、doLast在任务动作列表之后添加一个动作。一个任务里可以执行多次doFirst和doLast
一般使用插件(jar或war等等)提供的任务,如果满足不了需求可以自定一任务。

自定义一个task生成工程目录

//创建java工程代码目录def createDir = {    path ->        File dir = new File(path);        if(!dir.exists()){            dir.mkdirs();        }}//声明一个tasktask makeJavaDir(){    def paths = ['src/main/java','src/main/resources','src/test/java','src/test/resources',];    doFirst{        paths.forEach(createDir);    }}

然后点击gradle中的刷新,就会在other中出现定义的任务
这里写图片描述
点击可以生成jar包,我们可以运行有main方法的jar包,例

java -classpath build/libs/tododemo-1.0-SNAPSHOT.jar com.kedou.gradle.tododemo.App

再编写一个任务依赖,这里创建一个web工程的目录

task makeWebDir(){    dependsOn 'makeJavaDir'    def paths = ['src/main/webapp','src/test/webapp'];    doLast {        paths.forEach(createDir);    }}

doFirst和doLast是生命周期执行阶段的执行代码,上例中其他就是配置阶段的代码

gradle 任务与插件

Android知识要点整理(21)—-Gradle 之创建任务和插件

构建生命周期

Gradle生命周期

依赖管理

常用仓库 mavenLocal/mavenCentral/jcenter,还有自定义maven仓库(也就是maven私服)。

依赖阶段配置

  • compile、runtime –源代码
  • testCompile、testRuntime – 测试代码
    这里写图片描述
    runtime依赖于compile,所以compile依赖的东西runtime也会依赖
    testCompile依赖与compile,所以compile依赖的东西testCompile也会依赖。

解决版本冲突

  • 查看依赖报告
  • 排除传递性依赖
  • 强制一个版本
  • gradle默认解决策略,自动帮我们依赖最高版本的jar包

修改默认解决策略,从而发现版本冲突

//修改默认解决策略,使其当有依赖冲突构建失败configurations.all {    resolutionStrategy{        failOnVersionConflict()    }}

加上如上配置,执行build,结果:

Error:A conflict was found between the following modules: - org.slf4j:slf4j-api:1.6.1 - org.slf4j:slf4j-api:1.7.22 - org.slf4j:slf4j-api:1.5.8

去掉上面的依赖冲突构建失败配置,点击task的help中的dependencies查看依赖树
这里写图片描述

点击后结果如下:

compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead).+--- org.hibernate:hibernate-core:3.6.3.Final|    +--- antlr:antlr:2.7.6|    +--- commons-collections:commons-collections:3.1|    +--- dom4j:dom4j:1.6.1|    +--- org.hibernate:hibernate-commons-annotations:3.2.0.Final|    |    \--- org.slf4j:slf4j-api:1.5.8 -> 1.7.22|    +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final|    +--- javax.transaction:jta:1.1|    \--- org.slf4j:slf4j-api:1.6.1 -> 1.7.22\--- ch.qos.logback:logback-classic:1.2.1     +--- ch.qos.logback:logback-core:1.2.1     \--- org.slf4j:slf4j-api:1.7.22

而使用默认策略的结果就是使用最新的
这里写图片描述

排除传递性依赖

样例:

compile ("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}") {  exclude group: 'org.slf4j', module: 'slf4j-api'  exclude group: 'ch.qos.logback', module: 'logback-classic'}

参考解决Gradle传递性依赖冲突

强制指定一个版本

//修改默认解决策略,使其当有依赖冲突构建失败configurations.all {    resolutionStrategy{        failOnVersionConflict()        force 'org.slf4j:slf4j-api:1.7.22'    }}

ext与gradle.properties的使用

关于Gradle配置的小结

全局配置

根(root)下的build.gradle中共同的东西配置在allprojects和subprojects中

gradle测试

这里写图片描述
常用的是这样被发现,其他测试框架则按照提供的文档来

发布

使用Gradle发布项目到JCenter仓库

源码

学习源码

原创粉丝点击