问题

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

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


#1 热门回答(248 赞)

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

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

Maven采用相反的方法,期望你完全与Maven生命周期集成。经验丰富的Ant用户发现这特别刺耳,因为Maven删除了Ant中的许多自由。例如,有一个aSonatype blog列举了许多Maven的批评及其回应。

Maven插件机制允许非常强大的构建配置,继承模型意味着你可以定义一小组父POM,封装整个企业的构建配置,并且各个项目可以继承这些配置,使它们保持轻量级。 Maven配置非常冗长(虽然Maven 3承诺解决这个问题),如果你想做任何"不是Maven方式"的事情,你必须编写插件或使用hacky Ant集成。注意我碰巧喜欢编写Maven插件,但是很多人会反对所涉及的工作。

Gradle承诺打到Ant和Maven之间的甜蜜点。它使用了Ivy的依赖解析方法。它允许约定优于配置,但也包括Ant任务作为一等公民。它还明智地允许你使用现有的Maven / Ivy存储库。

因此,如果你已经遇到任何Ant / Maven痛点,那么很可能值得尝试Gradle,但在我看来,如果你不仅仅为未知问题交易已知问题还有待观察。虽然布丁的证据是在吃东西,所以我会保留判断,直到产品稍微成熟一些,其他人已经解决了任何扭结(他们称之为出血的原因)。我仍然会在我的玩具项目中使用它,了解选项总是很好的。


#2 热门回答(80 赞)

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的无痛过渡路径。


#3 热门回答(64 赞)

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

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

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

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

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


原文链接