简介
本课程简要介绍了 Java 生态系统中的发展历程,并引出了各种构建工具。
软件是由企业中多个团队和数十名人员共同编写的,这些开发依赖于已经过测试并发布的软件组件。这与本科生在课程中学习编写软件的方式截然不同。新入职员工面临的首要挑战之一,就是如何有效地使用公司的构建生态系统。构建系统中的一个关键组成部分是构建工具;Maven 是 Java 产品中最流行的构建工具。正如我们将要学习的,Maven 远不止是一个构建工具,它还可以用于管理整个项目。以下是与 Maven 类似的其他工具:
- Ant
- Gradle
- Ivy
- Gulp
- Grunt
- Leiningen
- GNU Make
我们首先来了解构建系统中的一些基本术语及其含义。
构建
在软件开发中,构建是指将源代码文件转换为可在计算机上运行的独立软件制品的过程。生成的结果有时也被称为“构建”。在一个组织中,通常存在多个代码分支,其稳定程度各不相同,因此会定期生成夜间构建,并部署到不同的环境,如预发布、测试或生产环境。
构建工具
构建程序的过程通常由构建工具来管理,构建工具是一种协调和控制其他程序的程序。常见的例子包括 Make、Gradle、OpenMake Software 的 Meister、Ant、Maven、Rake、SCons 和 Phing。构建工具通常需要按正确顺序编译各个文件,下载依赖项,运行单元测试和集成测试,以及执行其他相关任务,以生成可部署的二进制文件。
制品
“制品”一词源自拉丁语 arte factum:其中 arte 意为“技艺”,factum 意为“制造”。在软件开发生命周期中,制品通常指由参与者产生的各类“对象”。例如:设计文档、数据模型、流程图、测试矩阵与计划、安装脚本(包括编译后的二进制文件)以及软件包。在大多数软件开发流程中,通常有一份明确要求产出的制品清单,相关人员需将其上传至共享驱动器或文档仓库,供他人查看和共享。制品偶尔也可指发布的代码(如代码库)或发布的可执行文件(如应用程序)。制品是软件开发过程的副产品。
构建自动化
构建自动化是指自动执行软件构建及其相关流程的过程。这包括将计算机源代码编译为二进制代码、打包二进制文件,以及运行自动化测试。当一个构建——即把开发者负责的文件和其他资源转化为最终可用形式的软件产品——能够无需人工干预即可生成,并且仅凭源码控制仓库中的信息就能随时执行时,这个构建过程就被视为自动化了。
CI/CD
CI/CD(持续集成与持续交付/部署)是构建和构建自动化领域中另一个常用术语。Maven 在 CI/CD 流水线中只是一个小小的环节,但理解代码从开发者的 IDE 如何最终变为生产环境中的二进制文件的整体图景至关重要。CI/CD 流水线的核心目标是让团队更频繁、更可靠地交付代码变更。现代的 CI/CD 流水线涵盖持续开发、持续测试、持续集成、持续部署以及在整个应用生命周期中对软件进行持续监控。
CI/CD 这个缩写有几种不同的含义。“CI”始终代表 持续集成,这是一种为开发者提交代码而设计的自动化流程。成功的持续集成意味着应用程序的新代码变更能被定期构建、测试并合并到共享代码库中。这是解决“集成地狱”问题的一种方案——即同时存在太多开发分支,彼此之间可能发生冲突。开发者检出一个分支并进行修改,但在尝试合并回主干时却发现大量合并冲突,解决这些冲突所花的时间甚至超过了编写代码本身。
“CD”在 CI/CD 中指的是 持续交付 和/或 持续部署,这两个概念密切相关,有时会被互换使用。它们都涉及进一步自动化流水线的后续阶段,但分别用来体现自动化程度的不同。
持续交付通常意味着开发者的代码变更会自动经过缺陷测试,并上传至代码仓库(如 GitHub 或 Perforce)。之后,运维团队可以将这些变更部署到预发布或生产环境。持续交付的目标是尽可能减少部署新代码所需的努力。然而,在持续交付中,责任止步于代码仓库。
持续部署则是在持续交付的基础上继续推进。它涉及将开发者的代码变更从仓库自动发布到生产环境,使客户能够立即使用。有时,“持续部署”这一术语也被用来包含持续交付的所有流程。
通常情况下,CI/CD 这个术语泛指三个相互关联的实践:持续集成、持续交付和持续部署。尽管在语义上略有差异,但只需将其理解为一条高度自动化、持续监控的流水线即可。Maven 是这条流水线中虽小却至关重要的一个组成部分。
总结
多年来,Maven 已变得非常流行,其成功的主要原因在于它定义了一套统一的软件构建接口。Maven 的智能功能通过其使用的 插件 实现,这些插件可以从 Maven 仓库中获取。Maven 将常见的构建任务抽象为可通过 Maven 调用的程序,这些程序被称为 插件。插件由中央统一维护并广泛共享,这也是我们下一课的主题。