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

Java 为什么使用Gradle而不是Ant或Maven?,java,maven,ant,build-process,gradle,Java,Maven,Ant,Build Process,Gradle,另一个针对Java的构建工具真正让我明白了什么 如果你把Gradle用在另一个工具上,为什么? < P>我现在不把愤怒当成一个玩具项目(作者指的是他们到目前为止只在Gradle使用了一个玩具项目,而不是Gradle是一个玩具项目-见评论”,但是我想说为什么会考虑使用它是因为蚂蚁和Maven的挫败感。 根据我的经验,蚂蚁经常只写是的,我知道写s是可能的,但事实是大多数人都不写。对于任何非琐碎的项目,它都会让人费解,并且会非常小心地确保复杂的构建是真正可移植的。它的命令性质可能导致在构建之间复制配置

另一个针对Java的构建工具真正让我明白了什么

<>如果你把Gradle用在另一个工具上,为什么?

< P>我现在不把愤怒当成一个玩具项目(作者指的是他们到目前为止只在Gradle使用了一个玩具项目,而不是Gradle是一个玩具项目-见评论”,但是我想说为什么会考虑使用它是因为蚂蚁和Maven的挫败感。 根据我的经验,蚂蚁经常只写是的,我知道写s是可能的,但事实是大多数人都不写。对于任何非琐碎的项目,它都会让人费解,并且会非常小心地确保复杂的构建是真正可移植的。它的命令性质可能导致在构建之间复制配置,尽管宏在这方面有所帮助

Maven采用了相反的方法,希望您完全集成到Maven生命周期中。经验丰富的Ant用户发现这一点特别令人不安,因为Maven剥夺了Ant中的许多自由。例如,有一个例子列举了许多Maven的批评及其回应

Maven插件机制允许非常强大的构建配置,继承模型意味着您可以定义一小部分父POM来封装整个企业的构建配置,单个项目可以继承这些配置,从而使它们变得轻量级。Maven配置非常详细,尽管Maven 3承诺会解决这个问题,如果您想做任何不是Maven方式的事情,您必须编写插件或使用hacky Ant集成。请注意,我碰巧喜欢编写Maven插件,但也明白很多人会反对所涉及的工作

Gradle承诺会在Ant和Maven之间找到最合适的位置。它使用的方法来解决依赖关系。它允许约定优于配置,但也包括作为一等公民的Ant任务。它还明智地允许您使用现有的Maven/Ivy存储库


因此,如果您遇到了Ant/Maven的任何一个痛点,那么可能值得尝试Gradle退出,尽管在我看来,您是否愿意用已知问题换取未知问题还有待观察。布丁的证据就在吃的过程中,所以我会保留判断,直到产品成熟一点,其他人已经解决了他们称之为“流血边缘”的任何问题。尽管如此,我仍然会在我的玩具项目中使用它,了解这些选项总是很好的。

Gradle可以用于许多目的——它是一把比Ant好得多的瑞士军刀——但它特别专注于多项目构建

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

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

在这些依赖编程特性之上,Gradle通过与ApacheIvy集成添加了项目和JAR依赖特性。正如你所知,Ivy是一个比Maven更强大、更不固执己见的依赖管理工具

Gradle检测项目之间以及项目和JAR之间的依赖关系。Gradle与Maven repositories download和upload一起工作,就像iBiblio one或您自己的存储库一样,但也支持您可能拥有的其他类型的存储库基础设施

在多项目构建中,Gradle既能适应,也能适应构建的结构和体系结构。您不必像Maven所要求的那样,根据构建工具调整您的结构或体系结构


Gradle非常努力地不妨碍你,Maven几乎从来没有这样做过。传统是好的,灵活性也是好的。Gradle为您提供的功能比Maven多得多,但最重要的是,在许多情况下,Gradle将为您提供一条远离Maven的轻松过渡之路。

Gradle将Ant和Maven完美地结合在一起,充分利用了这两种框架的优点。Ant的灵活性和约定优于Maven的配置、依赖关系管理和插件

所以,若您想要一个标准的java构建,比如maven,但测试任务必须执行一些自定义步骤,它可以如下所示

build.gradle:

除此之外,它还使用groovy语法,这比ant/maven的xml提供了更多的表达能力

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

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


我们使用Gradle并选择它而不是Maven和Ant。蚂蚁给了我们完全的灵活性,常春藤给了我们更好的依赖法力 gement比Maven更强大,但对多项目构建没有很好的支持。您最终需要进行大量编码以支持多项目构建。另外,有一些按约定构建是很好的,这使得构建脚本更加简洁。有了Maven,按照约定构建就太过分了,定制构建过程就成了一个难题。此外,Maven促进每个项目发布一个工件。有时,您将一个项目拆分为多个子项目,但希望所有子项目一起构建和版本控制。这并不是Maven的设计初衷


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

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

Ant+Ant contrib本质上是一种图灵完全编程语言,没有人真正想用它编程

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

它在配置方面遵循约定,但仅限于您想要的范围 它允许您编写灵活的自定义任务,如在Ant中 它提供了优于Ant和Maven的多模块项目支持 它有一个DSL,使80%的事情变得简单,20%的事情成为可能,这与其他构建工具不同,其他构建工具使80%的事情变得简单,10%的事情成为可能,10%的事情实际上是不可能的。
Gradle是我使用过的最具可配置性和灵活性的构建工具。学习DSL和配置等概念需要一些前期投资,但如果你需要一个毫无意义的、完全可配置的JVM构建工具,那就很难打败它。

管理本机构建也容易得多。Ant和Maven实际上只是Java。Maven有一些插件试图处理一些本机项目,但它们并没有起到有效的作用。Ant任务可以编写为编译本机项目,但它们太复杂和笨拙


我们使用JNI和许多其他本机代码编写Java。格雷德尔大大简化了我们的蚂蚁混乱。当我们开始在本地项目中引入依赖关系管理时,它是混乱的。我们让Maven来做,但等效的Gradle代码只是Maven所需代码的一小部分,人们可以阅读和理解它,而不必成为Maven大师。

Gradle将乐趣重新投入到构建/组装软件中。在我的整个职业生涯中,我都使用ant来构建软件,我一直认为开发工作中的实际构建部分是一个必要的缺点。几个月前,我们公司厌倦了不使用二进制回购协议,也就是将jar签入到风投中,我被赋予了调查这一点的任务。从常春藤开始,因为它可以栓在ant的顶部,没有太多的运气让我的人工制品像我想要的那样出版。我选择了maven,并对xml进行了黑客攻击,为一些简单的helper LIB做了出色的工作,但我在尝试捆绑准备部署的应用程序时遇到了严重的问题。在谷歌和阅读论坛上花了相当长的时间,最终下载了数万亿的各种插件的支持jar,而我很难使用这些插件。最后,我选择了格拉德尔,在这一点上,我感到非常痛苦,并为它不应该如此艰难而恼火

但从第一天起,我的情绪开始好转。我有进展了。我花了大约两个小时来迁移我的第一个ant模块,构建文件基本上什么都没有。容易安装的一个屏幕。最大的惊喜是:用xml构建脚本,这有多愚蠢?声明一个依赖项占用一行对我很有吸引力->您可以在一个页面上轻松地看到某个项目的所有依赖项。从那时起,我就一直在努力,到目前为止,我遇到的每一个问题都有一个简单而优雅的解决方案。我认为原因如下:

groovy对于java开发人员来说非常直观 文档非常棒 灵活性是无穷的 现在,我花了几天的时间试图想出新的特性来添加到构建过程中。那有多恶心

这不是我的答案,但肯定会引起我的共鸣。它来自:

使用基于XML的构建工具(如Ant和 Maven:太多愤怒的尖括号和粗糙的插件 架构。而语法问题可以通过 生成、插入- 在体系结构中,严重限制了构建的能力 随着项目变得越来越复杂,工具可以优雅地增长。我们来了 感觉插件是错误的抽象级别,并且更喜欢 基于语言的工具,比如Gradle和Rake,因为它们提供 更细粒度的抽象和更大的灵活性


我部分同意Ed Staub的观点。与maven相比,Gradle无疑更强大,并提供了更大的灵活性

在执行了从maven迁移到gradle的评估之后,我们决定在两个问题上坚持maven本身
我们遇到的gradle速度比maven慢,代理不起作用。

@Tom我并不是说gradle是一个玩具项目,但到目前为止我只在一个玩具项目上使用过它。很抱歉,你觉得自己被误导了。尽管年龄太大,我还是编辑了这篇文章,以澄清评论中澄清的内容。这一误解立即将这篇文章涂上了反格雷德尔的颜色。如果有人像我一样研究Gradle,一开始误解了我的开场白,他们可能不会像我一样读得更远,或者读得更清楚。如果您不同意/不喜欢,请还原/编辑我的更改。值得一提的是,我甚至在阅读方括号中的部分之前就没有得到@RichSeller意味着Gradle是玩具项目的印象。当我到目前为止只阅读一个玩具项目时,我立即得到了作者指的是Gradle本身是一个玩具项目的印象,特别是在混乱之后,我自己也不在愤怒中使用Gradle。这表明作者在不生气时确实使用了Gradle。我建议重写第一整句话。就我个人而言,我认为Eclipse集成很好。将它安装到Juno中相当简单。不过,在作者写下这个答案2年后!谷歌也加入了Gradle的android sdk。Intellij现在增加了对gradle的支持。这使gradle成为主流,不仅仅是玩具项目Spring工件现在也是由gradle创建的,我认为Hibernate也是如此。+1对于xml中的构建脚本,这有多愚蠢?2000年,XML被认为是有史以来最酷的东西,所以公平地说,它在当时似乎更时髦,而不是愚蠢。基于XML的编程语言基本上是Lisp,因为它们对每个命令都有打开/关闭分隔符。但它们是lisp的超级冗长版本,其中4个字符的代码变成了40个字符。这是学习打字的一种方式,但不是我喜欢的方式。我在v1.2中遇到了代理问题,但从那以后我认为它一直在工作。所以,ctnlm或类似的应用程序是maven解决NTLM代理问题的解决方案。Gradle有这种开箱即用的支持。虽然这很简单,但我想知道为什么Maven从来没有对基于NTLM auth的代理提供这种开箱即用的支持。
ant.copy(file:'a.txt', toDir:"xyz")
ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}