1. 项目自动化的好处
- 防止手动介入
- 创建可重复的构建
- 让构建便携
2. 项目自动化的类型
- 按需构建:开发人员在自己的机器上触发构建
- 触发构建:代码提交到版本控制系统时触发构建
- 预定构建:通过定时任务进行构建
3. 构建工具
3.1 构建工具的组成
构建文件+构建的输入输出+构建引擎+依赖管理器
构建文件
构建文件包含了构建所需的配置信息、定义外部依赖,例如第三方类库,还包含了以任务形式实现某个特殊目的的指令和它们的相互依赖关系。
构建的输入输出
一个任务会接收一个输入,然后执行一系列步骤,最后产生-一个输出。某些任务也许不需要输入,也不需要产生一个必要的输出。在复杂的任务依赖关系中,也许会使用一个依赖任务的输出作为输入。
构建引擎
构建文件的一.步步指令或者规则集必须被翻译成构建工具可以理解的内部模型。构建引擎会在运行时处理构建文件,解析任务之间的依赖,设置好执行所需要的全部配置。
一旦内部模型建立好了, 引擎就会按照正确的顺序去执行一系列任务。某些构建工具还允许你通过API去访问这个模型,以便在运行时获取构建信息。
依赖管理器
依赖管理器用于处理你在build文件中声明的依赖定义,从工件仓库(例如,本地文件系统、一个FTP或者HTTP服务器)中解析它们,并使它们对项目可用。依赖通常是指外部依赖,一种JAR文件形式的可重用类库(例如,Log4j 对日志的支持)。该仓库就像是依赖的储藏所,通过标识符组织和描述它们,例如名字和版本。
一个典型的仓库可以是HTTP服务器或者本地文件系统。
3.2 Java构建工具
3.2.1 Ant
Apache Ant (Another Neat Tool)是一个用Java编写的开源构建工具。其主要目 的是在Java项目中为常用任务提供自动化,例如编译源代码、运行单元测试、打包 JAR文件和生成Javadoc文档。另外,它还为文件系统和存档操作提供了许多不同 的预定义任务。如果任何一个任务不满足需求,那么你就可以用Java写新的任务来 扩展构建。
虽然Ant的核心是用Java编写的,但是build文件是通过XML表示的,这样 就可以在任何运行时环境下使用了。Ant 不提供依赖管理器,所以你需要自己管理 外部依赖。然而,Ant 可以和另一个Apache项目Ivy 很好地集成,它是一个完善且独立的依赖管理器。要集成Ant和Ivy需要一些额外的工作, 而且要为每个独立的 项目手动配置。让我们一起看一个样例构建脚本。
示例:
<project name="my-app" default="dist" basedir="."> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <property name="version" value="1.0"/> <target name="init"> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source"> <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}" classpath="lib/commons-lang3-3.1.jar" includeantruntime="false"/> </target> <target name="dist" depends="compile" description="generate the distribution"> <!-- Create the distribution directory --> <mkdir dir="${dist}"/> <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/my-app-${version}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up"> <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
缺点:
- 使用xml定义构建逻辑,会导致构建脚本过于臃肿
- 复杂的构建逻辑会导致又长又难以维护的构建脚本。无法定义类似 if-else 的逻辑结构
- 没有提供任何指导来告诉你如何构建项目,可能会导致每次构建的结果都不一样
- 无法知道有多少类被编译或多少个task被执行;没有提供获取内存信息的api
- 如果没有lvy,很难管理依赖
3.2.2 Maven
Maven选择约定优于配置的思想,这意味着它为你的项目配置 和行为提供了有意义的默认值。项目自然而然就知道去哪些目录寻找源代码以及构 建运行时有哪些task去执行。如果你的项目遵从默认值,那么只需要写几行XML 就可以建立-一个完整的项目。另外,Maven 也拥有为应用产生包含Javadoc 在内的 HTML格式项目文档的能力。
Maven的核心功能可以通过开发定制的插件来扩展。Maven的社区非常活跃,几乎支持构建的每个方面,从集成其他工具到生成报告,你都能够找到合适的插件。如果找不到满足需求的插件,你也可以自己去写。
示例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0</version> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> <scope>compile</scope> </dependency> </dependencies> </project>
缺点:
- maven推荐一个默认的生命周期,常常会太过限制,可能不适合你的项目需求
- 编写扩展过于麻烦,需要使用Mojos
4. 为什么学习 Gradle
4.1 gradle 特性
可表达性的构建语言的底层API
Gradle 就是 Groovy:gradle 的 DSL 由Groovy 实现
灵活的约定:默认配置可轻松改变
鲁棒和强大的依赖管理
可扩展的构建:支持增量构建和部分构建
轻松的可扩展性:编写插件方便
和其他构建工具集成:支持 Ant 和 Maven 等的迁移和支持
5. 参考
- 《实战Gradle 中文版》