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

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

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

如果你使用Gradle在另一个工具上,为什么?< /P> < P>我自己不会用愤怒(只是一个玩具项目)(作者指的是,到目前为止,他们只在Gradle上使用了一个玩具项目,而不是Gradle是一个玩具项目-见评论”,但是我想,人们会考虑使用它的原因是因为蚂蚁和Maven的挫败感。 根据我的经验,Ant通常只写(是的,我知道写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存储库(下载和上传),如iBiblio one或您自己的存储库,但也支持其他类型的存储库基础设施

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


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

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{
    ...
  }
}
除此之外,它还使用groovy语法,这比ant/maven的xml提供了更多的表达能力

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

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


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

使用Gradle,您可以拥有Ant的灵活性和Maven的常规构建。例如,用您自己的任务扩展传统的构建生命周期是微不足道的。如果你不想,你也不会被迫使用约定。Groovy在编码方面比XML好得多。在Gradle中,您可以在本地文件系统上定义项目之间的依赖关系,而无需为每个项目发布工件
ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}