为什么使用Gradle代替Ant或Maven?[关闭]


324

另一个针对Java的构建工具到底能给我带来什么?

如果您在其他工具上使用Gradle,为什么?


6
Google加入了适用于Android SDK的Gradle。developers.google.com/events/io/sessions/325236644。Intellij现在增加了对gradle的支持。这使gradle成为主流(不仅仅是玩具项目)
Jayan

Spring工件现在也由Gradle创建,我认为Hibernate是相同的。
2013年

Answers:


248

我不会用Gradle来激怒自己(到目前为止只是一个玩具项目)[作者表示,到目前为止,他们仅在一个玩具项目上使用Gradle,而不是Gradle是一个玩具项目-请参阅评论],但我要说的是人们之所以考虑使用它的原因是因为Ant和Maven的挫败感。

根据我的经验,Ant通常是只写的(是的,我知道可以编写漂亮的模块化,优雅的build,但是事实是大多数人不会写)。对于任何非平凡的项目,它都会变得弯曲,并会格外小心,以确保复杂的构建真正可移植。它的命令性性质可以导致在构建之间复制配置(尽管宏可以在此提供帮助)。

Maven采用相反的方法,希望您与Maven生命周期完全集成。经验丰富的Ant用户会发现这特别令人讨厌,因为Maven消除了您在Ant中拥有的许多自由。例如,有一个Sonatype博客,列举了许多Maven批评及其回应。

Maven插件机制允许非常强大的构建配置,并且继承模型意味着您可以定义一整套父POM,将整个企业的构建配置封装起来,并且各个项目都可以继承这些配置,从而使其轻量化。Maven配置非常冗长(尽管Maven 3承诺会解决此问题),如果您想做“非Maven方式”的任何事情,则必须编写插件或使用hacky的Ant集成。请注意,我碰巧喜欢编写Maven插件,但感谢许多人反对所涉及的工作。

Gradle承诺会在Ant和Maven之间达到最佳位置。它使用Ivy的方法来解决依赖项。它允许在配置上进行约定,但还包括Ant任务作为一等公民。它还明智地允许您使用现有的Maven / Ivy存储库。

因此,如果您遇到了任何麻烦,并且陷入了任何Ant / Maven的痛点,那么值得尝试Gradle,尽管在我看来,是否您不只是将已知问题换成未知问题,还有待观察。布丁的证据是在进食中,因此我会保留判断,直到产品更成熟,其他人消除了任何扭结(由于某种原因,他们称其为流血边缘)。不过,我仍将在玩具项目中使用它,意识到这些选择总是很高兴的。


69
@Tom我并不是说Gradle是一个玩具项目,但是到目前为止我只在玩具项目中使用过它。对不起,你觉得误导
丰富的卖家

18
Sleer-尽管年龄很大,但我还是编辑了该帖子以澄清内联注释中的澄清内容-误解立即使该帖子成为反Gradle。如果研究Gradle的人(像我一样)起初误解了该开场白(像我一样),那么他们可能不会进一步阅读或阅读澄清的评论(就像我几乎一样)。如果您不同意/不喜欢它,请还原/编辑我的更改。
Bert F

48
对于它的价值,我没有得到@RichSeller的印象,这意味着Gradle完全用于玩具项目(甚至在阅读方括号中的部件之前)。
Jack Leow 2012年

2
当我读到“到目前为止只有一个玩具项目”时,我立即感到印象是作者将Gradle本身称为玩具项目,尤其是在混淆了“我不使用Gradle激怒自己”之后。这表明作者在不生气时确实使用了Gradle。我建议只重写第一句话。
osa

79

Gradle可用于多种用途-比Ant更好的瑞士军刀-但它专门针对多项目构建。

首先,Gradle是一个依赖项编程工具,这也意味着它是一个编程工具。使用Gradle,您可以执行设置中的任何随机任务,并且Gradle将确保正确且及时地执行所有声明的依赖项。您的代码可以以任何形式的布局(树形,平面形,分散形,...)分布在许多目录中。

Gradle有两个不同的阶段:评估和执行。基本上,在评估期间,Gradle会在应该查找的目录中寻找并评估构建脚本。在执行期间,Gradle将执行评估期间已加载的任务,同时考虑到任务之间的相互依赖性。

在这些依赖项编程功能之上,Gradle通过与Apache Ivy的集成添加了项目和JAR依赖项功能。如您所知,Ivy是一个比Maven更强大,更自以为是的依赖性管理工具。

Gradle检测项目之间以及项目与JAR之间的依赖关系。Gradle可与Maven资料库(下载和上传)(如iBiblio)一起使用,也可以与您自己的资料库一起使用,还可以支持您可能拥有的其他种类的资料库基础架构。

在多项目构建中,Gradle既可适应又可适应构建的结构和体系结构。您不必像Maven那样使结构或体系结构适应构建工具。

Gradle尽力不让自己陷入困境,这是Maven几乎从未做出过的努力。约定好,但灵活性也好。Gradle为您提供了比Maven更多的功能,但最重要的是,在许多情况下,Gradle将为您提供远离Maven的轻松过渡路径。


64

这可能会引起争议,但是Gradle并没有掩盖它是一种成熟的编程语言的事实。

Ant + ant-contrib本质上是一种图灵完整的编程语言,没有人真正想要编程。

Maven尝试采取相反的方法,即尝试完全声明性,并在需要逻辑时强制您编写和编译插件。它还强加了一个完全不灵活的项目模型。Gradle结合了所有这些最佳工具:

  • 它遵循配置约定(ala Maven),但仅在您希望的范围内
  • 它使您可以像在Ant中一样编写灵活的自定义任务
  • 它提供了优于Ant和Maven的多模块项目支持
  • 它的DSL使80%的事情变得容易,而20%的事情变得可能(不同于其他构建工具,使80%的事情变得容易,10%的可能性和10%实际上不可能)。

Gradle是我尚未使用的最可配置和最灵活的构建工具。要学习DSL和诸如配置之类的概念,需要先进行一些投资,但是如果您需要一个精巧且完全可配置的JVM构建工具,那么这将是无与伦比的。


49

Gradle很好地结合了Ant和Maven,从这两个框架中汲取了最大的优势。Ant的灵活性以及约定,配置,依赖关系管理和Maven的插件。

因此,如果您想要像在maven中那样具有标准的Java构建,但是测试任务必须执行一些自定义步骤,则它可能如下所示。

build.gradle:

apply plugin:'java'
task test{
  doFirst{
    ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'}
  }
  doLast{
    ...
  }
}

最重要的是,它使用了Groovy语法,比ant / maven的xml提供了更多的表达能力。

它是Ant的超集-您可以在gradle中使用更好的,类似于groovy的语法(即)使用所有Ant任务。

ant.copy(file:'a.txt', toDir:"xyz")

要么

ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}

35

我们使用Gradle并选择了它而不是Maven和Ant。与Maven相比,Ant为我们提供了全面的灵活性,而Ivy提供了更好的依赖关系管理,但是对多项目构建没有很好的支持。您最终需要进行大量编码来支持多项目构建。还可以通过常规方式进行构建,这使构建脚本更加简洁。使用Maven时,按照常规进行构建会花费太多时间,并且自定义构建过程将成为一大难题。而且,Maven会促进每个发布工件的项目。有时,您有一个项目分解为多个子项目,但是您希望所有子项目都可以一起构建和版本控制。并不是Maven专为设计的。

使用Gradle,您可以灵活地使用Ant并按照Maven的约定进行构建。例如,通过您自己的任务来扩展传统的构建生命周期是微不足道的。如果您不想这么做,也不必强制使用约定。Groovy在代码方面比XML更好。在Gradle中,您可以定义本地文件系统上项目之间的依赖关系,而无需将每个项目的工件发布到存储库。最后,Gradle使用Ivy,因此具有出色的依赖项管理。到目前为止,对我来说,唯一真正的缺点是缺少成熟的Eclipse集成,但是Maven的选择并不是更好。


2
我个人认为Eclipse集成很好。将其安装到Juno中非常简单。
djangofan 2012年

1
作者写这个答案后2年!
丹尼斯

21

这不是我的答案,但肯定会引起我的共鸣。这是从2012年10月ThoughtWorks的技术雷达

两件事导致了基于XML的构建工具(如Ant和Maven)的疲劳:太多恼怒的尖括号和插件体系结构的粗糙。尽管语法问题可以通过一代代来解决,但是插件体系结构严重限制了构建工具随着项目变得越来越复杂而优雅地增长的能力。我们已经感觉到插件是错误的抽象级别,而是更喜欢基于语言的工具(例如Gradle和Rake),因为它们提供了更细粒度的抽象和更长期的灵活性。


16

Gradle将乐趣重新投入了构建/组装软件。我在整个职业生涯中都使用ant来构建软件,而且我一直认为开发工作中实际的“ buildit”部分是必不可少的。几个月前,我们公司对不使用二进制存储库(也就是将罐子检入vcs)感到厌倦,因此我承担了调查此事的任务。从常春藤开始,因为它可以用螺栓固定在蚂蚁上,所以运气不佳就可以像我想要的那样发布我的内置工件。我去了maven,用xml破解了,为一些简单的辅助程序libs出色地工作,但是在尝试捆绑准备部署的应用程序时遇到了严重的问题。花费了相当长的时间搜索谷歌插件和阅读论坛,并且为我难以使用的各种插件下载了数万亿的支持罐。

但是从第一天起,我的情绪就开始好转。我到某处。我花了两个小时来迁移我的第一个ant模块,而构建文件基本上没有任何内容。轻松安装一个屏幕。最大的“哇”是:用xml 构建脚本,这有多愚蠢?声明一个依赖项需要一行的事实对我很有吸引力->您可以轻松地在一页上看到某个项目的所有依赖项。从那时起,我始终如一地前进,对于迄今为止我遇到的每个问题,都有一个简单而优雅的解决方案。我认为这些是原因:

  • groovy对于Java开发人员而言非常直观
  • 文档很棒很棒
  • 灵活性是无限的

现在,我花了几天的时间尝试思考要添加到构建过程中的新功能。那病得厉害


+1表示“ 在xml中构建脚本,这有多愚蠢?” 在2000年,XML被认为是有史以来最酷的东西,因此,公平地说,它比当时的愚蠢更时髦。基于XML的编程语言基本上是lisps,因为它们具有每个命令的打开/关闭定界符。但是它们是Lisp的超级详细版本,其中4个字符的代码变为40个字符。这是学习打字的一种方法,而不是我的茶。
GlenPeterson

8

管理本机内部版本也容易得多。Ant和Maven实际上仅是Java。Maven存在一些尝试处理某些本机项目的插件,但它们的工作效率不高。可以编写用于编译本机项目的Ant任务,但是它们太复杂且笨拙。

我们使用JNI和许多其他本机位来处理Java。Gradle大大简化了我们的Ant混乱。当我们开始将依赖管理引入本机项目时,这很混乱。我们让Maven做到了,但是等效的Gradle代码只是Maven所需要的一小部分,人们可以阅读并理解它,而不必成为Maven专家。


3

我部分同意Ed Staub的观点。与Maven相比,Gradle绝对更强大,并且可以长期提供更大的灵活性。

在进行了从maven到gradle的评估之后,我们决定继续解决gradle遇到的两个问题(速度比maven慢,代理不起作用)。


我在v1.2中遇到代理问题,但从那时起,我认为它一直在工作。如此之多,ctnlm或类似的应用程序是maven解决NTLM代理问题的解决方案。Gradle提供了开箱即用的支持。尽管这是如此琐碎,但我想知道为什么Maven从来没有为基于NTLM auth的代理提供这种支持。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.