Ant vs Maven vs Gradle

前言

       在这篇文章,我们比较在JVM 生态系统中占主导地位的三类Java 自动化工具-Ant、Maven和Gradle。

Apache Ant

     最开始,Make是唯一的自动化构建工具,超过自定义的解决方案。Make起源于1976年,是Java最早的应用构建工具。

    Apache Ant(“Another Neat Tool”)一个用户自动化构建java应用的java库。另外,Ant也可以适用于非Java应用。它初始于Apache Tomcat的代码库中的一部分,2000年才正式作为项目单独发布。

    在很多方面,Ant非常类似于Make。它也足够的简单,任何使用它都不需要了解其他的知识。Ant 构建使用XML文件,按照惯例被叫做_build.xml。

不同阶段的构建过程被叫做“targets”。

这里是一个简单项目build.xml文件,其中HelloWorld为main class。

<project>
    <target name="clean">
        <delete dir="classes" />
    </target>
 
    <target name="compile" depends="clean">
        <mkdir dir="classes" />
        <javac srcdir="src" destdir="classes" />
    </target>
 
    <target name="jar" depends="compile">
        <mkdir dir="jar" />
        <jar destfile="jar/HelloWorld.jar" basedir="classes">
            <manifest>
                <attribute name="Main-Class"
                  value="antExample.HelloWorld" />
            </manifest>
        </jar>
    </target>
 
    <target name="run" depends="jar">
        <java jar="jar/HelloWorld.jar" fork="true" />
    </target>
</project>

这个构建文件定义了4个targets:clean、compile、jar和run。例如:我们可以编译代码通过运行:

ant compile

       这个首先将触发 clean,删除“classes”目录。然后target compile将重建“classes”,编译src文件之后存储到其中。

     Ant最大的好处是弹性的,Ant没有任何强制的编码约束和项目架构。因此,意味着开发者需要自行编写所有的Ant命令。有时候,巨大的XML构建文件也是很难去管理。

    由于没有约束,只是知道Ant不意味着,我们可以很快的明白任何的Ant构建文件。它还是需要花时间明白一个不熟悉的Ant文件。对比其他工具,这就是一个缺陷。

     最开始,Ant 没有内置支持依赖管理。然而近些年依赖管理变成一个必须的。Apache Ivy作为Apache Ant的一个子项目。它与Apache Ant进行集成。遵循相同的设计准则。

    但是,Ant 从最开始没有内置依赖管理和构建XML无法管理的失败,导致创建了Maven。

     

Apache Maven

      Apache Maven 是一个依赖管理和自动构建的工具。主要使用于java应用。Maven沿用Ant的XML文件配置,但是更多的是管理。它是宗旨是约定高于配置。

      Ant提供了灵活性,需要从头开始编写。Maven则依赖于约束和提供预编译的命令(goals)。

      简单来说,Maven关注我们将要做什么,并且给我们提供框架实现它。另外一方面,Maven提供了内置支持依赖管理。

     Maven的配置文件,包含构建和依赖管理架构,按照惯例叫做pom.xml文件。另外,Maven还严格的规定项目的架构。而Ant则是比较灵活的。

     这是一个简单的pom.xml对于相同的Java项目,HelloWorld是主要的class

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
      http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>baeldung</groupId>
    <artifactId>mavenExample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>Maven example</description>
 
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

但是项目的架构是标准化的按照Maven的约束

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

与Ant相对的,该项目不需要手工的来定义每个阶段。我们可以简单的调用Maven内置的命令。

例如,我们可以编译代码通过运行

mvn compile

正如官方说明,Maven可以作为一个插件执行的框架,所有的工作都可以通过插件执行。Maven支持大范围的可用框架,他们都可以通过另外的配置。

      其中一个可以用的copy-dependencies(复制依赖)的Apache Maven 插件目标是实现复制依赖到一个指定的目录。

      显示插件,我们可以将插件放在我们的pom.xml文件和配置一个输出的目录对于我们所有的依赖。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/dependencies
                          </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这个插件将会在package阶段,假设我们执行

mvn package

我们将执行这个插件和复制依赖到目标或者依赖的目录。

这是一篇以前的文件讲解怎么创建一个可以执行的jar使用不同的Maven插件。另外,对于更详细的Maven细节,可以看看Maven的核心指导,将展示Maven的关键功能。

Maven变得越来越流行,对比Ant构建文件的标准化文件和更加显著的花更少时间管理构建文件.然而尽快更多的标准化比Ant文件,Maven配置文件越来越趋向大和笨重。

Maven严格的约束使用一个较小的代价换来更多的灵活对比Ant。目标的定制化是比较麻烦,所以写定制化构建脚本比较难做,对比Ant.

尽管Maven在构建应用上处理更加方便和标准化,但是仍然需要花一定的代价灵活性的降低相对于Ant。这也是创建Gradle结合两个最好的功能:Ant的灵活和Maven的功能。

Gradle

Gradle是一个依赖管理和自动构建的工具,以Ant和Maven的概念进行创建的。

其中一件事是,我们可以看到关于Gradle不是使用XML文件,不像Ant或者Maven。

随着时间的迁移,越来越多的开发者有兴趣使用一个领域特定语言。简而言之,是允许他们使用特定的语言来解决特定领域的问题。

         Gradle采用的DSL基于Groovy。这就是导致了更少配置文件的使用混乱,对于指定设计特定区域的问题。Gradle的配置文件约束叫做:build.gradle。

         这是一个简单的java项目文件的bulid.gradle 。HelloWorld主要的class。

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

我们编译代码可以通过运行:

gradle classes

Gradle特意的提供很少的功能,插件可以提供所有的有用功能。在我们的例子中,我们使用了java插件允许我们编译java代码和其他有用的功能。

Gradle给每步构建的步骤为“tasks”,它类似于Ant的“targets” 或者Maven的“phases”。在使用Maven的依赖管理插件和她指定的目标复制依赖包到指定的目录。在使用Gradle,我们同样可以使用Tasks:

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

我们可以运行这个Task来执行:

gradle copyDependencies

总结

在这篇文件,我们展示了Ant,Maven和Gradle,三种Java自动构建工具。

不要惊讶,Maven仍然占据了自动构建工具市场。然而Gradle,已经有很好的采用在复杂的代码库中,包括一些开源的项目如Spring。

转载于:https://my.oschina.net/hbt/blog/3020178

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值