关闭

gradle基础

标签: gradle
168人阅读 评论(0) 收藏 举报
分类:

安装

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();
        }
}

//声明一个task
task 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仓库

源码

学习源码

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27424次
    • 积分:977
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:18篇
    • 译文:7篇
    • 评论:0条