构建工具的产生

  在项目开发过程中,出于测试或正式发布的目的,需要进行一系列步骤来构建项目生成可执行的二进制文件。一般来说,首先需要确定项目所需的依赖都已正确安装,然后将项目源代码和依赖编译链接生成可执行的二进制文件。若存在自动化的测试任务,需要运行测试保证程序的正确性,之后将二进制代码打包发布,如下图所示。
  在小型项目中,开发者往往还可以手工输入命令调用构建过程。但在大型的项目,人工确定需要被构建的模块、构建的顺序以及解决项目中的依赖关系几乎是不可能的,而且这样做还使开发人员把大量的时间和精力浪费在了重复的机械性工作上。但计算机却很适合用来解决机械且重复的工作,因此自然而然催生了自动化构建的概念,并在1976年由Stuart Feldman实现了世界上第一个软件构建工具Make。
  维基百科对自动化构建(Build Automation)定义如下:

  Build automation is the process of automating the creation of a software build and the associated processes including: compiling computer source code into binary code, packaging binary code, and running automated tests.1
  自动化构建是将软件的构建自动化的过程,其内容包括:将源代码编译成二进制代码、打包二进制代码并运行自动化的测试。

常见构建工具

  • Java项目:Ant、Maven和Gradle
  • C/C++项目:make、cmake
  • C#项目:MsBuild

构建工具的优点2

1. 自动化构建过程
  上文已经提到过,将项目从源代码打包成用于发布的二进制可执行文件需要经历若干步骤,这些步骤是比较固定的,而且在开发时需要经常执行这一系列动作。
  完全可以使用构建工具完成这些高度重复、机械性的工作,让开发人员把精力放在真正的项目开发工作中,提高开发效率。

2. 自动管理依赖
  在不使用构建工具开发Java项目时,一般需要手动下载相应依赖的JAR包并放到项目的lib/目录中,并且使用版本控制工具如Git时需要将库文件一并上传,导致项目臃肿。
  部分构建工具如Maven或Gradle等集成了依赖管理的功能,开发人员在配置文件中指定项目需要的依赖及版本号后,构建工具可以自动管理和下载正确版本的项目依赖。这一优势在多人协作开发时更显著,可以避免很多版本不正确导致的问题。

3. 自动确定命令的执行顺序
  一些命令具有严格的执行顺序,如:Java的类A使用了类B,则需要首先编译类B,才能正确地编译类A(某些IDE也可以自动处理这种关系,所以这一过程并不一定可见)。对于大型的项目,要人工理清依赖关系,然后按正确的顺序执行编译命令几乎是不可能的,而构建工具可以解决这个问题。

4. 加快构建速度
  对于并不互相依赖的任务,构建工具可以充分发挥多核CPU的优势,并行执行多个任务,加快构建速度。而部分构建工具如Gradle采用了更高级的策略来取得进一步的加速。

5. 使用持续集成(CI)的必要前提
  在持续集成(Continuous Integration)实践中,代码集成到主干前,必须经过自动构建和自动化测试,以便尽早发现代码中的错误。因此若要使用持续集成,则必须使用自动构建工具。

Java构建工具的发展

  Java生态中最常用的三种构建工具分别为Ant、Maven和Gradle,这三种工具的兴衰交替也体现了构建工具设计思想的演进。其发布的时间节点如下所示:

  • 2000 — Apache Ant发布
  • 2002 — Apache Maven 1.0发布
  • 2012 — Gradle 1.0发布

  Ant使用XML文件定义任务及任务之间的依赖关系,具有较高的灵活性。目前Ant已经逐渐淡出历史舞台。
  Maven遵循约定优于配置(Convention over Configuration) 的原则,若在创建项目时遵循相应的约定,则可以避免许多配置文件的书写。另外,Maven提出了仓库(repository)的概念,具有依赖管理的能力,能自动管理和正确下载项目构建需要的大量依赖。
  Gradle是新生力量,综合了Ant和Maven的优点,兼具灵活性和约定优于配置的设计原则,同时也具有依赖管理的功能。Gradle使用Groovy DSL或Kotlin DSL书写构建脚本,具有极大的灵活性,且相较XML更加简洁。


  1. Build Automation - Wikipeida ↩︎

  2. A general introduction to build tools ↩︎

「Gradle学习笔记」一、构建工具相关推荐

  1. dma接收双缓存 stm32_「STM32学习笔记」USART 新特性

    之前的学习笔记"SPI不够用?USART来帮忙"一文中介绍了用如何把USART当做SPI来用的方法.此外,ST的USART还有很多新特性,没准有你不知道的. 在此,我们整理出来以下 ...

  2. 「GIS学习笔记」国土空间规划背景下村庄规划的探索研究

    [GIS学习笔记·实操篇]国土空间规划背景下村庄规划的研究探索 人送外号徐半仙儿,公众号名称:半仙儿说规划 01 前言 水了这么久终于又有大更新啦 [GIS学习笔记·十篇]系列里面的实操篇-国土空间规 ...

  3. python3 byte_「Python3学习笔记」读书笔记—字节数组

    生物都是由细胞构成的,但在我们普通人眼中,并不会将鸡.鸭.狗.鸟这些动物当作细胞看待,因为对待事物的角度决定了我们更关心生物的外在形状和行为,而不是它的组织构成. 从计算机底层实现来说,所有的数据都是 ...

  4. 用户登陆_「python学习笔记」用户登陆需求实现(for/if/str知识点)

    本文·导读·目录 1.用户登陆程序需求 2.知识点 3.代码 4.运行结果 一.用户登陆程序需求: 1. 输入用户名和密码: 2. 登陆成功后显示欢迎信息,失败提示重试: 3. 登陆仅有三次机会, 如 ...

  5. python pow和**_「Python学习笔记」Python函数高级应用

    Python, 函数本身也是一个对象函数既可以赋值,也可以用作其他函数的参数,还可作为其他函数的返回值. 使用函数变量 Python的函数也是一种值:所有函数都是function对象,这意味着可以把函 ...

  6. 「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析

    「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析 前言 一.我的开发环境 二.使用 Vue CLI (Vue 脚手架)快速搭建项目 三.初始项目的目录结构 ...

  7. 「学习笔记」品优购项目-上(页面公共部分 )

    「学习笔记」品优购项目-上 品优购项目-上 目标 品优购项目规划 网站制作流程 品优购项目介绍 品优购项目的学习目的 开发工具以及技术栈 开发工具 技术栈 品优购项目搭建工作 创建的文件夹如下(称为项 ...

  8. 「学习笔记」黑马面面布局开发

    「学习笔记」黑马面面布局开发 黑马面面布局开发 一.目的 1.1 技术方案 1.2 代码规范 1.2 目录规范 二.流程开发 2.1 蓝湖/摹客协作平台 2.2 适配方案 2.3 初始化文件 2.4 ...

  9. 「学习笔记」多项式的蛇皮操作

    文章目录 「学习笔记」多项式的蛇皮操作 前置知识 趋近 自然常数 对数 逆元 导函数 牛顿迭代与泰勒公式 不定积分与定积分 多项式乘法 多项式求逆元 多项式除法/取模 多项式牛顿迭代法 多项式开根 「 ...

最新文章

  1. 每日一皮:给老板演示刚做好的功能...
  2. Redis几个认识误区
  3. python语言的翻译方式是什么-python自动翻译实现方法
  4. CSS的子选择器与后代选择器的区别
  5. shell 命令详解
  6. apache2.4.9 开启path_info访问_如何通过SSH访问NAS?
  7. 那些年我们踩过的一些坑之 ClickHouse
  8. 军用计算机品牌,军用电脑笔记本有何特点 军用电脑笔记本品牌推荐
  9. “方法X对于类型Y是模糊的” Java模糊方法调用null错误
  10. 面试归来,感觉无望,下次再战
  11. 图像形状特征(一)--FD
  12. L2TP 配置实例——CALL LNS
  13. HTMLParser错误解决
  14. 微信支付:小微商户申请入驻第一步:平台证书序列号的获取
  15. 阿里云ACP云计算认证有用吗?
  16. 学生请假管理系统(需求说明+项目(部分代码))
  17. python可以剪辑视频吗_你知道吗?Python也可以剪辑视频!
  18. Matlab如何绘制小提琴图?
  19. 最大似然概率和后验概率的区别
  20. python基础“猜单词游戏”代码

热门文章

  1. Android:下载图片
  2. iphone界面元素的大小
  3. 东北大学OJ-1229: 实验4-1 :华氏摄氏温度转换(顺序结构)
  4. 水果贵到吃不起,“水果自由”要电商平台来实现?
  5. 如何搭建简易蓝牙定位系统
  6. 【DL】第 3 章:高级卷积网络
  7. c 怎么跨服务器取文件,c语言远程文件获取服务器
  8. linux系统命令vi存盘退出的其他方法
  9. 独立站快速启动到起量的秘诀
  10. AlexNet模型思想详解及核心代码实现