资讯专栏INFORMATION COLUMN

慕课网_《新一代构建工具gradle》学习总结

antyiwei / 2766人阅读

摘要:时间年月日星期二说明本文部分内容均来自慕课网。项目一个项目代表一个正在构建的组件比如一个文件,当构建启动后,会基于实例化一个类,并且能够通过变量使其隐式可用。任务动作定义了一个最小的工作单元。

时间:2017年05月16日星期二
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...

第一章:课程介绍 1-1 项目自动化介绍

石器时代:自动化构建工具产生之前

</>复制代码

  1. 依赖管理:将所有使用到的jar包放到lib目录下,不易管理,易出错
  2. 测试:能不写就不写,一个一个运行测试
  3. 打包:通过eclipse的export导出jar包或war包
  4. 上传:通过ftp工具进行上传到服务器解压运行

构建工具的作用

</>复制代码

  1. 依赖管理:各种jar包及版本
  2. 测试、打包、发布:自动执行测试、打包、发布到指定的地方
  3. 机器能干的活,绝不自己动手

主流构建工具

</>复制代码

  1. Ant:编译、测试、打包
  2. Maven:依赖管理、发布
  3. Gradle:Groovy语言管理构建脚本

示意图

Gradle是什么

</>复制代码

  1. 一个开源的项目自动化构建工具,建立在Apache Ant和Apache Maven概念的基础上,并引入基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本。

Gradle能做什么

</>复制代码

  1. 进行依赖管理
  2. 自动化运行测试
  3. 打包
  4. 发布到指定地方
1-2 课程介绍

快速尝鲜

</>复制代码

  1. 准备使用Gradle
  2. 第一个Gradle项目

基本原理

</>复制代码

  1. 构建脚本介绍
  2. 依赖管理

深入实战

</>复制代码

  1. 多项目构建
  2. 测试
  3. 发布

示意图

第二章:准备使用Gradle 2-1 gradle安装

安装

</>复制代码

  1. 确保已近安装JDK,java –version验证是否已经安装。
  2. 从Gradle官网下载Gradle,https://gradle.org
  3. 配置环境变量,GRADLE_HOME
  4. 添加到path,%GRADLE_HOME%in;
  5. 验证是否安装成功,gradle –v
2-2 Groovy理论介绍

Groovy是什么

</>复制代码

  1. Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯碎的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。

与Java比较

</>复制代码

  1. Groovy完全兼容Java的语法
  2. 分号是可选的
  3. 类、方法默认是public
  4. 编译器给属性自动添加getter/setter方法
  5. 属性可以直接用点号获取
  6. 最后一个表达式的值会被作为返回值
  7. “==”等同于“equals()”,不会有NullPointerExceptions

高效的Groovy特性

</>复制代码

  1. assert语句
  2. 可选类型定义
  3. 可选的括号
  4. 字符串
  5. 集合API
  6. 闭包
2-3 Groovy与Java比较

Java语法编写标准JavaBean

代码演示:

</>复制代码

  1. public class ProjectVersion{
  2. private int major;
  3. private int minor;
  4. public ProjectVersion(int major,int minor){
  5. this.major = major;
  6. this.minor = minor;
  7. }
  8. public int getMajor(){
  9. return major;
  10. }
  11. public void setMajor(int major){
  12. this.major = major;
  13. }
  14. public int getMinor(){
  15. return minor;
  16. }
  17. public void setMinor(int minor){
  18. this.minor = minor;
  19. }
  20. }

Groovy语言编写JavaBean

</>复制代码

  1. class ProjectVersion{
  2. private int major
  3. private int minor
  4. ProjectVersion(int major,int minor){
  5. this.major = major
  6. this.minor = minor
  7. }
  8. }
2-4 Groovy高效特性

Groovy高效特性

</>复制代码

  1. 可选的类型定义
  2. assert断言
  3. 括号是可选的
  4. 字符串
  5. 集合API

代码演示:

</>复制代码

  1. // 高效特性
  2. // 1 可选的类型定义
  3. def version = 1
  4. // 2 assert
  5. //assert version == 2
  6. // 3 括号是可选的
  7. println version
  8. // 4 字符串
  9. def s1 = "imooc"
  10. def s2 = "gradle version is ${version}"
  11. def s3 = """my
  12. name is
  13. imooc"""
  14. //println s1
  15. //println s2
  16. //println s3
  17. // 5 集合API
  18. // list
  19. def buildTools = ["ant","maven"]
  20. buildTools << "gradle"
  21. assert buildTools.getClass() == ArrayList
  22. assert buildTools.size() == 3
  23. // map
  24. def buildYear = ["ant":2000,"maven":2004]
  25. buildYear.gradle = 2009
  26. //println buildYear.ant
  27. //println buildYear["gradle"]
  28. //println buildYear.getClass()
  29. // 6 闭包
  30. def c1 = {
  31. v ->
  32. print v
  33. }
  34. def c2 = {
  35. print "hello"
  36. }
  37. def method1(Closure closure){
  38. closure("param")
  39. }
  40. def method2(Closure closure){
  41. closure()
  42. }
  43. method1(c1)
  44. method2(c2)
2-5 Groovy重点

代码演示:

</>复制代码

  1. // 构建脚本中默认都是有Project实例的
  2. //Project实例的apply方法
  3. apply plugin:"java"
  4. //Project实例的version属性
  5. version = "0.1"
  6. // 闭包作为参数调用repositories方法
  7. repositories {
  8. mavenCentral()
  9. }
  10. // 闭包作为参数调用dependencies方法
  11. dependencies {
  12. compile "commons-codes:commons-codes:1.6"
  13. }
第三章:第一个Gradle项目 3-1 第一个Gradle项目介绍

示例介绍

</>复制代码

  1. ToDo应用程序,只实现添加代办事项
  2. Java应用程序版
  3. Web版
3-2 应用程序版

目录结构

3-2 Web版

代码演示:

</>复制代码

  1. group "com.myimooc"
  2. version "1.0-SNAPSHOT"
  3. apply plugin: "java"
  4. apply plugin: "war"
  5. sourceCompatibility = 1.8
  6. configurations.all {
  7. resolutionStrategy {
  8. failOnVersionConflict()
  9. // 强制指定一个版本
  10. force "org.slf4j:slf4j-api:1.7.22"
  11. }
  12. }
  13. repositories {
  14. // maven{
  15. // url ""
  16. // }
  17. mavenLocal()
  18. mavenCentral()
  19. }
  20. dependencies {
  21. // https://mvnrepository.com/artifact/org.hibernate/hibernate-core
  22. compile (group: "org.hibernate", name: "hibernate-core", version: "3.6.3.Final"){
  23. // 排除传递依赖
  24. exclude group:"org.slf4j",module:"slf4j-api"
  25. }
  26. // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
  27. compile "ch.qos.logback:logback-classic:1.2.3"
  28. testCompile group: "junit", name: "junit", version: "4.11"
  29. }
  30. // 声明 闭包:创建目录,需传入参数为字符串目录路径
  31. def createDir = {
  32. // 参数
  33. path ->
  34. // 功能
  35. println path
  36. File dir = new File(path);
  37. if(!dir.exists()){
  38. dir.mkdirs();
  39. }
  40. }
  41. // 任务:自动创建Java工程目录结构
  42. task makeJavaDir(){
  43. // 定义数组存放目录路径
  44. def paths = ["src/main/java", "src/main/resources", "src/test/java", "src/test/resources"];
  45. // 添加动作:doFirst:在动作列表的前面插入一个动作
  46. doFirst{
  47. for(String path : paths){
  48. // 调用 闭包
  49. createDir(path)
  50. }
  51. }
  52. }
  53. // 任务:自动创建Web工程目录结构
  54. task makeWebDir(){
  55. // 声明当前任务依赖 makeJavaDir 任务
  56. dependsOn "makeJavaDir"
  57. def paths = ["src/main/webapp", "src/test/webapp"]
  58. // 添加动作:doLast:在动作列表的后面插入一个动作
  59. doLast{
  60. for(String path : paths){
  61. // 调用 闭包
  62. createDir(path)
  63. }
  64. }
  65. }
第四章:高级应用 4-1 构建脚本介绍

构建块

</>复制代码

  1. Gradle构建中的两个基本概念是项目(Project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保他们的执行顺序。

项目(Project)

</>复制代码

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

项目的属性和方法

</>复制代码

  1. group、name、version
  2. apply、dependencies、repositories、task
  3. 属性的其他配置方式:extgradle.properties

任务(task)

</>复制代码

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

任务的方法

</>复制代码

  1. dependsOn
  2. doFirst、doLast<<
4-2 自定义任务

代码演示:

</>复制代码

  1. // 声明 闭包:创建目录,需传入参数为字符串目录路径
  2. def createDir = {
  3. // 参数
  4. path ->
  5. // 功能
  6. println path
  7. File dir = new File(path);
  8. if(!dir.exists()){
  9. dir.mkdirs();
  10. }
  11. }
  12. // 任务:自动创建Java工程目录结构
  13. task makeJavaDir(){
  14. // 定义数组存放目录路径
  15. def paths = ["src/main/java", "src/main/resources", "src/test/java", "src/test/resources"];
  16. // 添加动作:doFirst:在动作列表的前面插入一个动作
  17. doFirst{
  18. for(String path : paths){
  19. // 调用 闭包
  20. createDir(path)
  21. }
  22. }
  23. }
  24. // 任务:自动创建Web工程目录结构
  25. task makeWebDir(){
  26. // 声明当前任务依赖 makeJavaDir 任务
  27. dependsOn "makeJavaDir"
  28. def paths = ["src/main/webapp", "src/test/webapp"]
  29. // 添加动作:doLast:在动作列表的后面插入一个动作
  30. doLast{
  31. for(String path : paths){
  32. // 调用 闭包
  33. createDir(path)
  34. }
  35. }
  36. }
4-3 构建生命周期

构建生命周期

</>复制代码

  1. 初始化:初始化需要参与构建的项目
  2. 配置:根据配置代码生成task的依赖顺序和执行顺序
  3. 执行:执行动作代码

示意图:

构建周期构造方法

4-4 依赖管理

概述

</>复制代码

  1. 几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递依赖带来的版本冲突。

工件坐标

</>复制代码

  1. group:工件组
  2. name:工件名称
  3. version:版本
  4. 通过这三个属性来唯一确定一个jar包

常用仓库

</>复制代码

  1. mavenCentral:公共仓库
  2. jcenter:公共仓库
  3. mavenLocal:本地仓库
  4. 自定义maven仓库:maven私服,公司内部仓库
  5. 文件仓库:不建议使用

依赖的传递性

</>复制代码

  1. B依赖A,如果C依赖B,那么C依赖A。

自动化依赖管理

依赖管理阶段

</>复制代码

  1. 源代码:compile:编译阶段;runtime:运行阶段。
  2. 测试代码:testCompile:编译阶段;testRuntime:运行阶段。

依赖阶段关系

4-5 解决版本冲突

版本冲突例子

解决冲突

</>复制代码

  1. 查看依赖报告
  2. 排除传递性依赖
  3. 强制指定一个版本

4-6 多项目构建介绍

项目模块化

</>复制代码

  1. 在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。项目符合高内聚低耦合时,模块化就变得很容易,这是一条非常好的软件开发实践。

TODO模块依赖关系

配置要求

</>复制代码

  1. 所有项目应用Java插件
  2. web子项目打包成war
  3. 所有项目添加logback日志功能
  4. 统一配置公共属性

项目范围

4-7 多项目构建实战

详见源代码。

4-8 自动化测试

自动化测试

</>复制代码

  1. 一些开源的测试框架比如JUnit,TestNG能够帮助你编写复用的结构化的测试,为了运行这些测试,你要先编译它们,就想编译源代码一样。测试代码的作用仅仅用于测试的情况,不应该被发布到生产环境中,需要把源代码和测试代码分开来。

项目布局

测试配置

测试任务

测试发现

</>复制代码

  1. 任何继承自junit.framework.TestCasegroovy.util.GroovyTestCase的类
  2. 任何被@RunWith注解的类
  3. 任何至少包含一个@Test注解的类
4-9 发布

发布到本地和远程仓库

发布过程

</>复制代码

  1. 使用maven-publish插件
  2. 配置发布任务,仓库地址
  3. 执行发布任务,发布完成
第五章:课程总结 5-1 课程总结

示意图

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70094.html

相关文章

  • 课网_《Spring Boot热部署》学习总结

    时间:2017年12月01日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com 教学源码:无 学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 热部署的使用场景 本地调式 线上发布 热部署的使用优点 无论本地还是线上,都适用 无需重启服务器:提高开发、调式效率、提升发布、运维效率、降低运维成本 前置...

    Channe 评论0 收藏0
  • 课网_《2小时学会SpringBoot》学习总结

    摘要:小时学会学习总结时间年月日星期六说明本文部分内容均来自慕课网。慕课网教学示例源码暂无。数据库操作下第六章事务管理事务管理只有查询的时候不加事务,其它任何操作都要加事务。第七章课程回顾课程回顾总结介绍安装配置的使用数据库操作 《2小时学会SpringBoot》学习总结 时间:2017年2月18日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示...

    aisuhua 评论0 收藏0
  • 课网_《ElasticSearch入门》学习总结

    摘要:时间年月日星期四说明本文部分内容均来自慕课网。那么里面的数据就可以分为各种各样的索引,比如汽车索引图书索引家具索引等等。图书索引又可以细分为各种类型,比如科普类小说类技术类等等。具体到每一本书籍,就是文档,就是整个图书里面最小的存储单位。 时间:2017年09月14日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https...

    notebin 评论0 收藏0
  • 课网_《JSON快速入门(Java版)》学习总结

    摘要:时间年月日星期日说明本文部分内容均来自慕课网。慕课网教学示例源码无个人学习源码第一章课程概述课程介绍课程须知本课程面向所有使用语言进行开发的小伙伴。 时间:2017年05月21日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:课程概述 1-1 ...

    shiina 评论0 收藏0

发表评论

0条评论

antyiwei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<