本文共 3667 字,大约阅读时间需要 12 分钟。
1.Gradle是什么
一个开源的项目自动化构建工具, 建立在Apache Ant和Apache Maven 概念的基础上,并引入了基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本
2.主流构建工具
3.构建工具的作用
4.gradle 优点
构建生命周期
Groovy
Groovy 是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,即可以用于面向对象编程,又可以用作纯粹的脚本语言。 使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性
Groovy 特点
高效的Groovy特性
Groovy 与java对比
// 可选类型定义def version = 1// assertassert version == 2// 可选的括号println(version)println version//字符串def s1 = 'ctoedu'def s2 = "version is ${version}"def s3 = ''' projectnameisctoedu'''// 集合api//listdef buildTools=['ant','maven']buildTools << 'gradle'assert buildTools.getClass() == ArrayListassert buildTools.size() == 3//mapdef buildYears = ['ant':2000, 'maven':2004]buildYears.gradle = 2009println buildYears.antprintln buildYears['gradle']println buildYears.getClass()
build.gradle
//构建脚本中默认都有一个Project实例apply plugin:'java'version = '0.1'repositories { mavenCentral()}dependencies { compile 'commons-codec:commons-codec:1.6'}
Gradle 构建中的两个基本概念是项目(project) 和任务(task), 每个构建至少包含一个项目,项目中包含一个或多个任务。 在多项目构建中,一个项目可以依赖于其他项目。类似的,任务可以形成一个依赖关系图来确保他们的执行顺序
一个项目代表一个正在构建的组件(比如一个Jar文件),当构建启动后, Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用
自定义task
def createDir = { path -> File dir = new File(path); if(!dir.exists()){ dir.mkdirs(); }}task makeJavaDir() { def paths = ['src/main/java','src/main/resources','src/test/java','src/test/resources'] doFirst{ paths.forEach(createDir) }}task makeWebDir() { dependsOn 'makeJavaDir' def paths = ['src/main/webapp','src/test/webapp'] doLast { paths.forEach(createDir) }}
概述
几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递性依赖带来的版本冲突。
工件坐标
常用仓库
依赖的传递性
依赖阶段配置
repositories{ maven { url '' } mavenLocal() mavenCentral()}
解决版本冲突
修改默认解决策略
configurations.all{ resolutionStrategy{ failOnVersionConflict() }}
排除传递性依赖
compile('org.hibernate:hibernate-core:3.6.3.Final') { exclude group:"org.slf4j", module: "slf4j-api" //transitive = false}
强制指定一个版本
configurations.all { resolutionStrategy { failOnVersionConflict() force 'org.slf4j:slf4j-api:1.7.24' }}
在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳的实践,这需要你清晰的划分功能的边界,比如业务逻辑和数据持久层分开来。 项目符合高内聚低耦合时,模块化就变的很容易,这是一条非常好的软件开发实践
配置要求
allprojects { apply plugin: 'java' sourceCompatibility = 1.8}subprojects { repositories { mavenCentral() } dependencies { }}
//Repository 依赖 Modeldependencies { compile project(":model")}
grodle.properties
group = 'com.imooc.gradle'version = 1.0-SNAPSHOT
一些开源的测试框架比如JUnit,TestNG能够帮助你编写可复用的结构化的测试,为了运行这些测试,你要先编译他们,就像编译源代码一样。测试代码的作用仅仅用于测试的情况,不应该被发布到生产环境中。 需要把源代码和测试代码分开。
dependencies { testCompile 'junit:junit:4.11'}
publishing { publications{ myPublish(MavenPublication) { from components.java } } repositories { maven { name "myRepo" url "" } }}