为什么使用Gradle而不是Ant或Maven?
针对Java的另一个构build工具是否真的让我受益匪浅?
如果您使用Gradle而不是其他工具,为什么?
我自己并没有在愤怒中使用Gradle (目前为止只是一个玩具项目) [作者意味着他们迄今为止只在一个玩具项目上使用了Gradle,而不是Gradle是一个玩具项目 – 请参阅评论] ,但是我会说人们会考虑使用它的原因是因为Ant和Maven的挫折。
根据我的经验,Ant常常是只写的(是的,我知道可以编写精美的模块化,优雅的构build ,但实际上大多数人不这么做)。 对于任何不平凡的项目,它都变得非常灵活,并且非常谨慎地确保复杂的构build是真正可移植的。 它的命令性质可以导致在构build之间复制configuration(虽然macros可以在这里帮助)。
Maven采取相反的方法,并期望您完全整合Maven生命周期。 经验丰富的Ant用户发现这一点特别激动人心,因为Maven删除了你在Ant中的许多自由。 例如,有一个Sonatype博客列举了许多Maven的批评和他们的回应。
Maven插件机制允许非常强大的构buildconfiguration,inheritance模型意味着您可以定义一小组父母POM封装整个企业的构buildconfiguration,单个项目可以inheritance这些configuration,从而使它们变得轻量级。 Maven的configuration是非常冗长的(尽pipeMaven 3承诺解决这个问题),如果你想做的事情是“不是Maven的方式”,你必须编写一个插件或使用hacky Ant集成。 注意我碰巧喜欢写Maven插件,但是很欣赏很多人会反对所涉及的努力。
Gradle保证会在Ant和Maven之间达到最佳状态。 它使用艾维的方法来解决依赖。 它允许约定configuration,但也包括作为一等公民的Ant任务。 它也明智地允许您使用现有的Maven / Ivy存储库。
所以如果你碰到任何Ant / Maven的痛点,可能值得尝试一下Gradle,尽pipe在我看来,如果你不会为未知的问题交易已知的问题,我们仍然有待观察。 布丁的certificate是在吃东西,所以我会保留判断,直到产品稍微成熟一些,并且其他人已经解决了任何扭结(他们称之为出血的缘故)。 尽pipe如此,我仍然会在玩具项目中使用它,总是有好的select。
Gradle可以用于多种目的 – 这是一个比Ant更好的瑞士军刀 – 但是它特别专注于多项目构build。
首先,Gradle是一个依赖编程工具,也意味着它是一个编程工具。 使用Gradle,您可以在您的设置中执行任何随机任务,Gradle将确保所有已声明的依赖关系都得到正确且及时的执行。 您的代码可以以任何布局(树,平面,散布等)分布在多个目录中。
Gradle有两个不同的阶段:评估和执行。 基本上,在评估过程中,Gradle将在它应该看起来的目录中查找和评估构build脚本。 在执行期间,Gradle将执行评估期间已经加载的任务,并考虑到任务相关性。
除了这些依赖编程特性之外,Gradle还通过与Apache Ivy集成来添加项目和JAR依赖特性。 正如你所知,与Maven相比,常青藤是一个更强大,更less见的依赖pipe理工具。
Gradle检测项目之间以及项目和JAR之间的依赖关系。 Gradle与Maven仓库(下载和上传)一起工作,就像iBiblio仓库或者你自己的仓库一样,也支持你可能拥有的其他types的仓库基础设施。
在多项目构build中,Gradle既适应又适应构build的结构和体系结构。 您不必像Maven那样将自己的结构或架构调整到构build工具。
Gradle非常努力的不要妨碍你,Maven几乎永远不会做出这样的努力。 公约是好的,灵活性也是如此。 Gradle为您提供了比Maven更多的function,但是最重要的是,在许多情况下,Gradle将为您提供远离Maven的无痛迁移path。
这可能有点争议,但是Gradle并没有隐瞒它是一种完全成熟的编程语言。
Ant + ant-contrib本质上是一种图灵完整的编程语言,没有人真的想编程。
Maven试图采取相反的方法来完全声明,如果你需要逻辑,强迫你编写和编译一个插件。 它也强加了一个完全不灵活的项目模型。 Gradle结合了所有这些工具中的优点:
- 它遵循convention-over-configuration(ala Maven),但仅限于你想要的程度
- 它可以让你编写像Ant一样灵活的自定义任务
- 它提供了优于Ant和Maven的多模块项目支持
- 它有一个DSL,使80%的东西容易和20%的东西成为可能(不像其他的构build工具,使80%容易,10%可能和10%有效的不可能)。
Gradle是我尚未使用的最具可configuration性和灵活性的构build工具。 它需要一些投资来学习DSL和configuration等概念,但如果你需要一个没有废话和完全可configuration的JVM构build工具,这是很难打败的。
Gradle很好地结合了Ant和Maven,从两个框架中获得了最好的结果。 来自Ant的灵活性和来自Maven的configuration,依赖pipe理和插件的约定。
所以如果你想有一个标准的Java构build,就像在maven中,但testing任务必须做一些自定义的步骤,它可能看起来像下面。
的build.gradle:
apply plugin:'java' task test{ doFirst{ ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'} } doLast{ ... } }
最重要的是,它使用groovy语法,它提供了更多的expression能力,然后ant / maven的XML。
它是Ant的一个超集 – 你可以使用更好的Groovy-like语法在Gradle中使用所有的Ant任务。
ant.copy(file:'a.txt', toDir:"xyz")
要么
ant.with{ delete "x.txt" mkdir "abc" copy file:"a.txt", toDir: "abc" }
我们使用Gradle并通过Maven和Antselect它。 Ant给了我们全面的灵活性,而且Ivy比Maven提供更好的依赖pipe理,但是对于多项目构build并没有很好的支持。 你最终做了很多编码来支持多项目构build。 还有一些按照惯例构build是很好的,并使构build脚本更简洁。 使用Maven,它会按照惯例过多地构build,定制构build过程就会变成黑客。 此外,Maven还会推动每个发布工件的项目。 有时您将项目拆分为子项目,但是您希望所有子项目都一起构build和版本化。 并不是Maven专门devise的。
借助Gradle,您可以拥有Ant的灵活性,并可以按照Maven的惯例进行构build。 例如,用自己的任务来扩展传统的构build生命周期是微不足道的。 如果你不想要,你不会被迫使用惯例。 Groovy比XML编码更好。 在Gradle中,您可以在本地文件系统上定义项目之间的依赖关系,而不需要将每个项目的工件发布到存储库。 最后,Gradle使用Ivy,所以它有很好的依赖pipe理。 到目前为止,我唯一真正的缺点是缺乏成熟的Eclipse集成,但是Maven的select并不是那么好。
这不是我的答案,但它肯定与我共鸣。 来自2012年10月的ThoughtWorks技术雷达 :
有两件事情导致了像Ant和Maven这样的基于XML的构build工具的疲劳:太多恼人的尖括号以及插件架构的粗糙。 虽然语法问题可以通过生成来处理,但是插件架构严重限制了构build工具在项目变得更加复杂的时候能够正常发展的能力。 我们开始觉得插件是错误的抽象层次,而更喜欢Gradle和Rake等基于语言的工具,因为它们提供了更细致的抽象和更长的灵活性。
Gradle把乐趣放回到构build/组装软件中。 我用ant来构build我整个职业生涯的软件,而且我始终认为开发工作的实际“构build”部分是一个必要的罪恶。 几个月前,我们公司已经厌倦了不使用二进制回购(也就是检查vcs中的jar子),我被赋予了调查这个任务的任务。 从常春藤开始,因为它可能被拴在ant上面,没有太多的运气让我的build筑文物出版像我想要的。 我去了maven,用xml破解了,为一些简单的帮助程序库工作出色,但是我遇到了严重的问题,试图将应用程序准备好部署。 在Googlesearch插件和阅读论坛上search了很长时间,并且下载了数万亿个支持JAR的插件。 最后,我去了gradle(在这一点上变得非常痛苦,并且讨厌“不应该这么难!”)
但从第一天起,我的情绪开始好转。 我正在某处。 花了我两个小时来迁移我的第一个ant模块,构build文件基本上什么都没有。 很容易安装一个屏幕。 大的“哇”是:用xml 编写脚本 ,这是多么愚蠢? 声明一个依赖项的事实占用一行对我来说非常有吸引力 – >您可以轻松地在一个页面上查看某个项目的所有依赖项。 从那以后,我一直在不停地滚动,至今我遇到的每个问题都有一个简单而优雅的解决scheme。 我认为这是原因:
- Groovy对于Java开发人员来说非常直观
- 文档是伟大的真棒
- 灵活性是无止境的
现在,我花了好几天的时间试图想出新的function来添加到我们的构build过程。 这有多恶心?
pipe理本地构build也容易得多。 Ant和Maven实际上是纯Java的。 Maven有一些插件试图处理一些本地项目,但是他们没有做一个有效的工作。 可以编写Ant任务来编译本地项目,但是它们太复杂又笨拙。
我们用JNI和许多其他本地位来执行Java。 Gradle大大简化了我们的Ant混乱。 当我们开始向本地项目引入依赖pipe理的时候,它很混乱。 我们得到了Maven这样做,但相当于Gradle的代码只是Maven需要的一小部分,人们可以阅读并理解它,而不必成为Maven的专家。
我同意Ed Staub的一部分。 Gradle肯定比Maven更强大,长期提供更多的灵活性。
在执行从maven到gradle的评估之后,我们决定坚持使用maven来解决我们遇到的两个问题:gradle(速度比maven慢,proxy不工作)。