为什么使用Gradle而不是Ant或Maven?

Itt*_*ayD 324 java ant build-process gradle maven

针对Java的另一个构建工具真的让我感到满意吗?

如果你使用Gradle而不是其他工具,为什么?

Ric*_*ler 248

我自己并没有愤怒地使用Gradle(到目前为止只是一个玩具项目)[作者意味着到目前为止他们只在玩具项目中使用Gradle,而不是Gradle是一个玩具项目 - 请参阅评论],但我会说人们会考虑使用它的原因是因为Ant和Maven的挫败感.

根据我的经验,Ant通常是只写的(是的,我知道可以编写精美的模块化,优雅的构建,但事实上大多数人都没有).对于任何非平凡的项目,它都会变得令人费解,并且非常谨慎地确保复杂的构建真正可移植.它的命令本质可以导致在构建之间复制配置(尽管宏可以在这里提供帮助).

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,尽管在我看来,如果你不仅仅为未知问题交易已知问题还有待观察.布丁的证据就在于吃,所以我会保留判断,直到产品稍微成熟一些,其他人已经解决了任何扭结(他们称之为出血的原因).我仍然会在我的玩具项目中使用它,了解选项总是很好的.

  • @Tom我并不是说Gradle是一个玩具项目,但到目前为止我只在玩具项目中使用它.对不起你感到被误导了 (69认同)
  • 对于它的价值,我没有得到@RichSeller的意思,毕竟Gradle用于玩具项目(甚至在阅读方括号中的部分之前). (48认同)
  • 睡眠 - 尽管年龄很大,我编辑了帖子以澄清内容在评论中澄清的内容 - 误解立即将帖子标记为反Gradle.如果有人研究Gradle(像我一样)最初误解了开头的句子(就像我做的那样),他们可能不会进一步阅读或阅读澄清评论(就像我几乎所做的那样).如果您不同意/不喜欢,请恢复/编辑我的更改. (18认同)
  • 当我读到"迄今为止只有一个玩具项目"时,我立即得到的印象是作者指的是Gradle本身就是一个玩具项目,特别是在令人困惑的"我自己并没有愤怒地使用Gradle"之后.这表明作者在愤怒时确实使用了Gradle.我建议只改写第一句话. (2认同)

Ste*_*ver 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的无痛过渡路径.


omn*_*sis 64

这可能有点争议,但Gradle并没有隐瞒它是一种完全成熟的编程语言这一事实​​.

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

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

  • 它遵循惯例 - 配置(ala Maven),但仅限于你想要的程度
  • 它允许您编写灵活的自定义任务,如Ant
  • 它提供了优于Ant和Maven的多模块项目支持
  • 它有一个DSL,使80%的东西容易,20%的东西可能(不像其他构建工具,使80%容易,10%可能,10%有效不可能).

Gradle是我尚未使用的最可配置和灵活的构建工具.它需要一些投资才能学习DSL和配置等概念,但如果你需要一个没有废话且完全可配置的JVM构建工具,那么它很难被击败.


pio*_*rga 49

Gradle很好地结合了Ant和Maven,从两个框架中获得最佳效果.Ant的灵活性和约定优于Maven的配置,依赖管理和插件.

因此,如果你想拥有一个标准的java版本,就像在maven中一样,但测试任务必须做一些自定义步骤,它可能如下所示.

的build.gradle:

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

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

它是Ant的超集 - 您可以在gradle中使用所有Ant任务,使用更好的,类似Groovy的语法,即.

ant.copy(file:'a.txt', toDir:"xyz")
Run Code Online (Sandbox Code Playgroud)

要么

ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}
Run Code Online (Sandbox Code Playgroud)


小智 35

我们使用Gradle并在Maven和Ant上选择它.Ant给了我们足够的灵活性,Ivy提供了比Maven更好的依赖管理,但是对多项目构建没有很大的支持.您最终会进行大量编码以支持多项目构建.还有一些build-by-convention很好,使构建脚本更简洁.使用Maven,它需要按照惯例进行构建,并且自定义构建过程会变成黑客.此外,Maven还会推广每个发布工件的项目.有时您将项目拆分为子项目,但您希望所有子项目一起构建和版本化.Maven的设计并不是真的.

使用Gradle,您可以拥有Ant的灵活性,并按照Maven的惯例进行构建.例如,使用您自己的任务扩展传统构建生命周期是微不足道的.如果你不愿意,你不会被迫使用约定.Groovy的编码比XML好得多.在Gradle中,您可以在本地文件系统上定义项目之间的依赖关系,而无需将每个工件的工件发布到存储库.最后,Gradle使用Ivy,因此它具有出色的依赖管理.到目前为止,我唯一真正的缺点是缺乏成熟的Eclipse集成,但Maven的选项并没有那么好.

  • 就个人而言,我认为Eclipse集成很好.将它安装到Juno非常简单. (2认同)

Ed *_*aub 21

这不是我的答案,但它确实引起了我的共鸣.它来自ThoughtWorks的2012年10月的技术雷达:

使用像Ant和Maven这样的基于XML的构建工具有两件事情造成了疲劳:太多愤怒的尖括号和插件架构的粗糙.虽然语法问题可以通过生成来处理,但是插件体系结构严重限制了构建工具随着项目变得更加复杂而优雅地增长的能力.我们认为插件是错误的抽象层次,而不喜欢Gradle和Rake等基于语言的工具,因为它们提供了更细粒度的抽象和更长期的灵活性.


小智 16

Gradle将乐趣带回建筑/组装软件.我在整个职业生涯中使用ant来构建软件,并且我一直认为开发工作的实际"构建"部分是必要的邪恶.几个月前,我们公司厌倦了不使用二进制仓库(也就是将罐装到vcs中),我被赋予了调查这个的任务.从常春藤开始,因为它可能被拴在蚂蚁之上,没有太多的运气,让我的建筑工件像我想要的那样发布.我去了maven并用xml攻击,为一些简单的帮助库工作了很棒但我遇到了严重的问题,试图捆绑应用程序准备部署.讨厌谷歌插件和阅读论坛,并为各种插件下载了数万亿的支持罐,我很难用.最后我去了gradle(在这一点上变得非常痛苦,并且生气地说"它不应该这么难!")

但从第一天起,我的情绪开始好转.我到了某个地方.我花了两个小时来迁移我的第一个ant模块,构建文件基本上没什么.轻松安装一个屏幕.最大的"哇"是:在xml中构建脚本,这有多愚蠢?声明一个依赖项占用一行这一事实对我非常有吸引力 - >您可以在一个页面上轻松查看某个项目的所有依赖项.从那时起,我一直在不停地滚动,因为到目前为止我遇到的每一个问题都有一个简单而优雅的解决方案.我认为这些是原因:

  • 对于Java开发人员来说,groovy非常直观
  • 文档很棒很棒
  • 灵活性是无止境的

现在,我花了很多时间试图想出添加到构建过程中的新功能.这有多恶心?


swp*_*mer 8

管理本机构建也更容易.Ant和Maven实际上只是Java.一些插件存在于Maven尝试处理一些本地项目,但他们没有做有效的工作.可以编写Ant任务来编译本机项目,但它们过于复杂和笨拙.

我们使用JNI和许多其他本机位来做Java.Gradle大大简化了我们的Ant混乱.当我们开始向本机项目引入依赖管理时,它很混乱.我们让Maven做到了,但是等效的Gradle代码只是Maven所需内容的一小部分,人们可以在不成为Maven大师的情况下阅读并理解它.