ant、maven、gradle对比

1、介绍

本文旨在探讨目前流行的三种项目构建工具,ant、maven、gradle,对于深入的使用和原理层面不做讨论。学习目的是,了解这三者的异同和各自的思想。

2、Apache Ant

最初,Make是唯一的构建自动化工具,它超越了自制的解决方案。Make从1976年就出现了,因此,在Java早期,被用于构建Java应用程序。

然而,C程序中的许多约定并不适合Java生态系统,所以随着时间的推移,Ant成为了一个更好的选择。

Apache Ant(“另一个整洁的工具”)是一个Java库(library),用于自动化Java应用程序的构建过程。此外,Ant还可以用于构建非Java应用程序。它最初是apachetomcat代码库的一部分,在2000年作为一个独立的项目发布。

在许多方面,AntMake非常相似,他们都非常简单,因此任何人都可以开始使用它,而无需任何特定的先决条件。Ant构建文件是用XML编写的,按照惯例,它们被称为build.XML。

构建过程的不同阶段称为“目标”(target)。

下面是使用HelloWorld主类的简单Java项目的build.xml文件示例:

 

Ant build.xml

上图构建文件定义了四个目标:clean、compile、jar和run。例如,我们可以通过运行以下命令来编译代码:

ant compile

这将首先触发目标clean,它将删除“classes”目录。之后,目标compile将重新创建目录并将src文件夹编译到其中。

Ant的主要优点是它的灵活性。Ant没有强加任何编码约定或项目结构。因此,这意味着Ant需要开发人员自己编写所有命令,这有时会导致难以维护的巨大XML构建文件。

因为没有约定,仅仅了解Ant并不意味着我们就能很快理解任何Ant构建文件。可能需要一些时间来习惯不熟悉的Ant文件,这与其他较新的工具相比是一个缺点。

一开始,Ant没有对依赖关系管理的内置支持。然而,随着依赖关系管理在后来成为必须,apacheivy被开发为apacheant项目的一个子项目。它与ApacheAnt集成,遵循相同的设计原则。

然而,最初的Ant限制是由于没有内置的依赖管理支持,以及在处理不可管理的XML构建文件时遇到的挫折,导致了Maven的创建。

3、Apache Maven

Apache Maven是一个依赖管理和构建自动化工具,主要用于Java应用程序。Maven继续像Ant一样使用XML文件,但使用的方式更易于管理。这里的游戏名称是约定重于配置。

虽然Ant提供了灵活性,并且要求一切都从头开始编写,但是Maven依赖于约定并提供预定义的命令(目标)(target)。

简单地说,Maven允许我们专注于构建应该做什么,并为我们提供了实现它的框架。Maven的另一个积极方面是它为依赖关系管理提供了内置支持

Maven的配置文件包含构建和依赖关系管理指令,按照惯例称为pom.xml。此外,Maven还规定了严格的项目结构,而Ant也提供了灵活性。

下面是一个pom.xml文件的示例,该文件用于使用之前的HelloWorld主类的同一个简单Java项目:


 

Maven pom.xml

然而,现在项目结构也已标准化,并符合Maven惯例:

+---src
|     +---main
|   |    +---java
|   |   |     \---com
|   |   |       \---baeldung
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |                  
|   |   \---resources
|       \---test
|              +---java
|                   \---resources

与Ant相反,不需要手动定义构建过程中的每个阶段。相反,我们可以简单地调用Maven的内置命令。

例如,我们可以通过运行以下命令来编译代码:

mvn compile

正如官方页面所指出的,Maven的核心是一个插件执行框架,因为所有的工作都是由插件完成的。Maven支持多种可用的插件,并且每个插件都可以额外配置。

可用的插件之一是apache maven Dependency Plugin,它有一个copy dependencies目标,将我们的依赖项复制到指定的目录。

要显示此插件的实际效果,让我们将此插件包含在pom.xml文件中,并为依赖项配置一个输出目录:

 

 

maven plugins

此插件将在包阶段执行,因此如果我们运行:

mvn package

我们将执行此插件并将依赖项复制到target/dependencies文件夹。

关于maven的细节和其他使用方式可以访问官方文档。

现在在java  application中Maven变得非常流行,因为构建文件现在已经标准化了,与Ant相比,维护构建文件所花的时间要少得多。然而,尽管比Ant文件更标准化,Maven配置文件仍然倾向于变得庞大和麻烦。

Maven的严格约定带来了比Ant灵活得多的代价。目标(target)定制非常困难,因此编写定制的构建脚本比Ant要困难得多。

尽管Maven在使应用程序的构建过程更容易和更标准化方面做了一些重要的改进,但由于它比Ant灵活得多,所以它仍然要付出代价。这导致了Gradle的诞生,它结合了两个世界的优点:Ant的灵活性和Maven的特性。

4、Gradle Build Tool

Gradle是一个依赖管理和构建自动化工具,它建立在Ant和Maven的概念之上。关于Gradle,我们首先要注意的一点是它没有使用XML文件,这与Ant或Maven不同。

随着时间的推移,开发人员对拥有和使用特定领域的语言越来越感兴趣——简单地说,这将允许他们使用为特定领域定制的语言来解决特定领域中的问题。

Gradle采用了这种方法,它使用的是基于GroovyKotlin的DSL。这导致了更小的配置文件和更少的混乱,因为该语言是专门为解决特定领域的问题而设计的。按照惯例,Gradle的配置文件在Groovy中称为build.Gradle,在Kotlin中称为build.Gradle.kts。注意,Kotlin在自动完成和错误检测方面提供了比Groovy更好的IDE支持。

下面是一个build.gradle文件的示例,该文件用于与之前的HelloWorld主类相同的简单Java项目:

apply plugin: 'java'
repositories {
    mavenCentral()
}
jar {
     baseName = 'gradleExample' version = '0.0.1-SNAPSHOT'
}
dependencies {
    testImplementation 'junit:junit:4.12'
}

我们可以通过运行以下命令来编译代码:

gradle classes

在它的核心,Gradle故意提供很少的功能。插件添加了所有有用的特性。在我们的示例中,我们使用了java插件,它允许我们编译java代码和其他有价值的特性。

Gradle将其构建步骤命名为“tasks”,而不是Ant的“targets”或Maven的“phases”。对于Maven,我们使用apachemaven依赖插件,将依赖项复制到指定目录是一个特定的目标。对于Gradle,我们可以通过使用任务来完成同样的任务(task)。

task copyDependencies(type:Copy) {
    from configurations.compile    
    into 'dependencies' 
}

我们可以使用如下命令执行它:

gradle copyDependencies

所以在gradle中定制task又像ant一样变得灵活可变。

5、总结

1、目前Maven占据了当今构建工具市场的大部分,这得益于java EE的蓬勃发展。
2、然而,Gradle在更复杂的代码库中得到了很好的采用,原因如下:1、很多开源项目,比如Spring,现在都在使用它,2、由于它的增量构建,在大多数情况下都比Maven快,3、它提供高级分析和调试服务
3、gradle如今变得更加流行的原因是微服务架构下,多语言开发早已成为必然趋势。
4、ant的低学习成本以及通用性,使得它仍然在一些老牌框架或者项目中被使用到。

然而,Gradle的学习曲线似乎更陡,特别是如果你不熟悉Groovy或Kotlin的话。

posted @ 2024-02-21 11:12  陈晓猛  阅读(520)  评论(0编辑  收藏  举报