首页 > 技术文章 > 构建工具

mnbvcxzasdfghjkl 2019-03-11 09:01 原文

构建工具的简单理解:

Java工程构建的发展是一个愈来愈便利高效的过程。从最初的所有jar包都放到工程目录下面,到用ide管理工程之间的依赖关系,但是工程下的jar包依赖依旧杂乱,继而有了ant脚本出现,不过其对于jar包的管理依旧不够高效简单,再后来出现了目前常用的maven,最后出现了基于Groovy语言的gradle。本文将介绍和对比java构建工具中的maven和gradle。

在Java构建工具的世界里, Maven几乎成为Java构建工具的事实标准。然而,冗余的依赖管理配置、复杂并且难以扩展的构建生命周期,都成为使用Maven的困扰。Gradle作为新的构建工具,获得了2010 Springy大奖,并入围了2011的Jax最佳Java技术发明奖。它是基于Groovy语言的构建工具,既保持了Maven的优点,又通过使用Groovy定义的DSL,克服了 Maven中使用XML繁冗以及不灵活等缺点。当然Gradel同样会有一些缺点,下文将要展开详述它和Maven之间的对比。

Maven技术介绍

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。发布于2004年,目的是解决码农使用Ant所带来的一些问题。Maven仍旧使用XML作为编写构建配置的文件格式,但是,文件结构却有巨大的变化。Ant需要码农将执行task所需的全部命令都一一列出,然而Maven依靠约定(convention)并提供现成的可调用的目标(goal)。不仅如此,有可能最重要的一个补充是,Maven具备从网络上自动下载依赖的能力(Ant后来通过Ivy也具备了这个功能),这一点革命性地改变了我们开发软件的方式。但是,Maven也有它的问题。依赖管理不能很好地处理相同库文件不同版本之间的冲突(Ivy在这方面更好一些)。XML作为配置文件的格式有严格的结构层次和标准,定制化目标(goal)很困难。因为Maven主要聚焦于依赖管理,实际上用Maven很难写出复杂、定制化的构建脚本,甚至不如Ant。用XML写的配置文件会变得越来越大,越来越笨重。在大型项目中,它经常什么“特别的”事还没干就有几百行代码。Maven的主要优点是生命周期。只要项目基于一定之规,它的整个生命周期都能够轻松搞定,代价是牺牲了灵活性。在对DSL(Domain Specific Languages)的热情持续高涨之时,通常的想法是设计一套能够解决特定领域问题的语言。在构建这方面,DSL的一个成功案例就是Gradle。

Gradle的特点

Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。Gradle结合了ant与maven的优点,在此基础之上做了很多改进。它具有Ant的强大和灵活,又有Maven的生命周期管理且易于使用。最终结果就是一个工具在2012年华丽诞生并且很快地获得了广泛关注。例如,Google采用Gradle作为Android OS的默认构建工具。Gradle不用XML,它使用基于Groovy的专门的DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。Gradle样板文件的代码很少,这是因为它的DSL被设计用于解决特定的问题:贯穿软件的生命周期,从编译,到静态检查,到测试,直到打包和部署。它使用Apache Ivy来处理Jar包的依赖。Gradle的成就可以概括为:约定好,灵活性也高。

Gradel与Mavel的比较

  1. 脚本Maven使用XML来定义生成脚本。和Ant一样,这是一个安全的选择,因为大多数人都熟悉XML配置。 Gradle构建脚本是用Groovy写的。 用XML优势在于它可以更方便地定义构建逻辑是比较复杂的步骤不仅仅是不变的一系列。 用Groovy的好处就是写起来比XML标签简洁得多。

  2. 性能一些 非正式的测试 表明Gradle 比Maven性能高不了,甚至还低一点,甚至两者似乎要明显慢于Ant。 使用Maven构建JBoss应用服务器比用Ant构建要多两倍的时间。(Ant是明显的赢家,Maven和Gradle大约相同)

  3. 依赖配置通常的Maven项目有一个单一的依赖的静态配置, 所以一个项目应该有只有一个单一的Artifact。 简单就是他的优势,但也缺乏弹性。 Gradle在这方面的更灵活。 可以在创建和处理的时候有多套依赖配置。(Gradle因为简单性和灵活性获胜,Maven和 Ant/Ivy次之)

  4. 使用Artifact仓库Maven有自己的单一仓库格式。 Gradle可以使用Ivy仓库和Maven仓库。 部署到Maven仓库是非常容易

  5. 加载构建系统的组件Maven采取的做法是每个用于构建的组件(编译/jar等)都作为一个插件。 每个插件都有它自己的版本和依赖关系树。 Gradle的构建系统组件都是分散的。 Maven插件的优点是在于可以独立更新,无需整个系统更新。Gradle的模型的优点是,编译需要核心组件以外的组件时才下载。

  6. 构建生命周期Maven提供有限的构建生命周期访问。 插件可以连接到生命周期的特定阶段,而且只有在核心插件执行。Gradle很容易,因为它可以轻松地访问任何生成的一部分,并允许用Groovy代码处理。

    总结起来,Gradel是更为前卫和高效灵活的配置技术,简单性易用性使得Gradel正在逐步替代Maven。正如在Eugene Dvorkin撰写的文章《最让人激动的5个Java项目》中,介绍Gradle的话:“工程自动化是软件项目成功的必要条件,而且它应该实现起来简单、易用、好玩。构建没有千篇一律的方法,所以Gradle没有死板的强加方法于我们,尽管你会认为查找和描述方法很重要,然而Gradle对于如何描述有着非常好的支持。我不认为工具能够拯救我们,但是Gradle能给你所需要的自由,你可以利用Gradle构建易描述的、可维护的、简洁的、高性能项目”。

推荐阅读