Gradle
Posted kz2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle相关的知识,希望对你有一定的参考价值。
概念:开源的项目自动化构建工具,在Ant和Maven的基础上,引入了基于Groovy的特定领域语言(DSL),不再使用XML形式管理构建脚本。
Tools-->groovy Console-->打开groovy视图
Groovy与Java比较:
// 类、方法默认是public的 完全兼容Java的语法 public class ProjectVersion{ // 大版本 private int major; // 小版本 private int minor; ProjectVersion(int major, int minor) { this.major = major this.minor = minor } int getMajor() { // 最后一个表达式的值会被作为返回值(最后一个方法的return可以不写) major } void setMajor(int major) { this.major = major } } // 分号是可选的 ProjectVersion v1=new ProjectVersion(1,1) // 编译器给属性自定添加getter/setter方法 属性可以直接用点号获取 println v1.minor ProjectVersion v2=null // == 等同于equals(),不会有NullPlinterExceptions println v2==v1
高效Groovy特性:
//1 可选的类型定义 //def version=1 //2 assert 失败的断言 因为version上面为1 //assert version==2 //3 括号是可选的 //println version //4 字符串 /*def s1=‘imooc‘ //仅仅是字符串 def s2="gradle version is ${version}" //可以插入变量 def s3=‘‘‘my name is imooc‘‘‘ //可以换行 println s1 println s2 println s3*/ //5 集合api //list /*def buildTools=[‘ant‘,‘maven‘] buildTools << ‘gradle‘ //添加元素 assert buildTools.getClass() == ArrayList //默认是ArrayList assert buildTools.size() ==3 //断言size */ //map /*def buildYears=[‘ant‘:2000,‘maven‘:2004] buildYears.gradle=2009 //添加元素 println buildYears.ant println buildYears[‘gradle‘] println buildYears.getClass() == LinkedHashMap //默认是LinkedHashMap*/ //6 闭包 代码块 一般用来方法传参 (不是必须的) /* def c1={ v -> print v } def c2={ print ‘hello‘ } def method1(Closure closure){ closure(‘param‘) //带参数的 } def method2(Closure closure){ closure() //不带参数的 } method1(c1) method2(c2)*/
最简单的例子(build.gradle):
//构建脚本中默认都是有个Project实例的 apply plugin:"java" //apply方法 plugin:"java"命名参数 --》代表着使用java这个插件 version=‘0.1‘ //变量 repositories{ mavenCentral() //闭包 无参调用repositories(仓库)方法 } dependencies{ compile ‘commons-codec:commons-codec:1.6‘ //闭包 有参调用dependencies(依赖管理)方法 }
TODO应用程序版:
TodoItem类:
public class TodoItem { //待办事项名称 private String name; //已完成 private boolean hasDone; public TodoItem(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isHasDone() { return hasDone; } public void setHasDone(boolean hasDone) { this.hasDone = hasDone; } @Override public String toString() { return name+(hasDone ? "hasDone":"need to do")+"!"; } } App类: import java.util.Scanner; public class App { public static void main(String[] args) { int i=0; Scanner scanner = new Scanner(System.in); while (++i>0){ System.out.println(i+". please input todo item name:"); TodoItem item=new TodoItem(scanner.nextLine()); System.out.println(item); } } }
进入构建栏目:
然后打成jar包
有main()方法 就可以直接终端启用了
TODO--web版:
右击项目选择add framework support --> 勾选web application(注:点击Java EE可选择java ee版本)==》添加web
编写个简单的index.html
apply plugin:‘war‘ //使用war插件
点击war进行构建 构建好后 放到tomcat的webapps下 启动tomcat进行测试
构建脚本概要:
构建块:
基本概念:
每个构建至少包含一个项目,项目中包含一个或多个任务。
1.项目(project)
一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用。
group、name、version来确认仓库中的唯一坐标。
重要的方法:
1.apply(插件) 2.dependencies(依赖) 3.repositories(仓库) 4.task(任务)
属性的其他配置方式:
ext、gradle.properties
2.任务(task)
对应org.gradle.api.Task。主要包括任务动作和任务依赖(dependsOn)。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件。
自定义任务(build.gradle):
//闭包 def createDir = { path -> File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } } //自定义任务1 task makeJavaDir() { def paths = [‘src/main/java‘, ‘src/main/resources‘, ‘src/test/java‘, ‘src/test/resources‘] //在动作列表之前插入 doFirst { paths.forEach(createDir); } } //自定义任务2 task makeWebDir(){ //任务依赖 dependsOn ‘makeJavaDir‘ def paths=[‘src/main/webapp‘,‘src/test/webapp‘] //在动作列表之后插入 doLast { paths.forEach(createDir) } }
进入构建栏目:
自定义任务在other这里。
构建生命周期:
初始化(项目)-->配置(依赖关系和执行图)-->执行(动作 如:doFirst doLast )
依赖管理:
常用仓库:
mavenLocal/mavenCentral/jcenter==》第一个是本地仓库 后两个是公共仓库
自定义maven仓库==》maven私服
写法:
repositories{ maven{ url ‘私服仓库地址‘ }}
阶段配置:
源代码阶段:
1.compile(编译阶段) 2.runtime(运行时阶段)
测试阶段:
1.testCompile(编译阶段) 2.testRuntime(运行时阶段)
一般都使用编译极端的依赖。
如:compile ‘group、name、version‘
解决版本冲突:
1.查看依赖报告
先修改默认解决策略(gradle默认依赖最新版本)
//发现版本冲突就自动构建失败 configurations.all{ resolutionStrategy{ failOnVersionConflict() }}
2.排除传递性依赖
compile(‘org.hibernate:hibernate-core:3.6.3.Final‘){ exclude group:"org.slf4j",module:"slf4j-api" }
3.强制一个版本
configurations.all{ resolutionStrategy{ force ‘org.slf4j:slf4j-api:1.7.24‘ }}
多项目构建:
发布:
allprojects{ apply plugin: ‘java‘ sourceCompatibility=1.8 //插件发布 apply plugin: ‘maven-publish‘ publishing{ publications{ //可以定义多个发布包 myPublish(MavenPublication){ //发布java from components.java } } repositories{ maven{ name "自定义名称" url "私服仓库地址" } } } }
以上是关于Gradle的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?
如何防止Android studio格式化build.gradle