构建工具:Ant、Maven、Gradle

目录

一.概述

 二.Apache Ant

三.Apache Maven

四.Gradle 

五.总结


一.概述

一个Java程序经过编译、测试、打包的步骤,在这个构建的过程中可以手动使用java、javac、jar命令来进行构建。随着工程文件的增加,便在最初使用Make来构建,GNU Make构建工具主要用于C语言项目,但是GNU Make并不限于某种编程语言,也不限于编译代码的场景。

构建工具是一个把源代码生成可执行应用程序的过程自动化的程序(例如Android app生成apk)。构建包括编译、连接跟把代码打包成可用的或可执行的形式。

但是,在C语言中有许多约定并不适合Java的生态,进而逐渐出现了Apache Ant以及后续的Apache MavenGradle。而目前三个主要构建JVM生态系统的Java构建自动化工具正是Apache Ant,Apache MavenGradle


 二.Apache Ant

  • Apache Ant 是一个 Java 库和命令行工具,其 任务是将构建文件中描述的进程作为目标驱动 和扩展点相互依赖。 Ant 的主要已知用途是构建 Java 应用程序。 Ant 提供了许多内置任务,允许编译、组装、 测试并运行 Java 应用程序。 Ant 还可以有效地用于构建非 Java 应用程序,用于 实例 C 或 C++ 应用程序。更一般地说,Ant 可用于 试行任何类型的过程,可以用目标来描述 和任务。
  • Ant 是用 Java 编写的。蚂蚁的用户可以开发自己的 “antlibs”包含 Ant 任务和类型,并提供 大量现成的商业或开源“antlibs”。
  • Ant 非常灵活,不强加编码约定或 Java项目的目录布局,这些项目采用它作为构建工具。

在许多方面,Ant 与 Make 非常相似,而且它足够简单,因此任何人都可以在没有任何特定先决条件的情况下开始使用它。Ant 构建文件是用 XML 编写的,按照惯例,它们被称为 build.xml

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

下面是一个带有 HelloWorld 主类的简单 Java 项目的build.xml文件示例:

<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>

 以上ant的构建脚本还是比较清楚的。ant定义了四个任务:clean, compile, jar, run。每个任务各自做什么都定义清楚。打包之前要先编译,所以通过depends来指定依赖的路径。如果在命令行里执行ant run,那就会先执行jar,而jar又依赖于compile,compile又依赖于clean,所以就会先执行clean。

所以删除生成的文件或目录、编译源代码、打包 JAR 文件、运行JAR 文件操作只需执行一条命令:

ant run

 此外,还可以用property定义或加载属性,例如:

<property file="build.properties"/>
<!--	从外部文件 build.properties 中加载属性。-->

<property name="src" value="src"/>
<!--	定义一个新的属性src,并将其值设置为src。-->

使用path用于指定编译时的类路径,例如:

<path id="public.class.path">
		<fileset dir="${publib}">
			<include name="**/*.jar"/>
		</fileset>
</path>
<!--  包括了一个文件集 (fileset),文件集会从指定目录中包含所有.jar 文件,以构建编译所需的类路径。-->

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

由于没有约定,只知道Ant并不意味着我们将很快理解任何Ant构建文件。习惯于使用不熟悉的Ant文件可能需要一些时间,与其他更新的工具相比,这是一个缺点。

起初,Ant没有内置的依赖管理支持。但是,由于依赖管理在以后的几年中成为必需,Apache Ivy被开发为Apache Ant项目的子项目。它与Apache Ant集成,遵循相同的设计原则。

但是,由于在使用不可管理的XML构建文件时没有内置支持依赖关系管理的初始Ant限制导致了Maven的创建。


三.Apache Maven

Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念 (POM),Maven 可以从一个中心信息来管理项目的构建、报告和文档。

虽然 Ant 提供了灵活性并要求从头开始编写所有内容,但 Maven 依赖于约定并提供预定义的命令(目标)。简单地说,Maven 让我们能够专注于我们的构建应该做什么,并为我们提供了做到这一点的框架。Maven 的另一个积极方面是它为依赖项管理提供了内置支持。

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

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

<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>

这样,就定义了自己的包的坐标是baeldung:mavenExample:0.0.1-SNAPSHOT,而工程依赖junit:junit:4.12。那么maven就会自动去把junit打包进来。如果本地没有junit,maven还会去网上下载。下载的地方就是远程仓库,我们可以通过repository标签来指定远程仓库。

maven里抛弃了ant中通过target定义任务的做法,而是引入了生命周期的概念。

Maven的生命周期(lifecycle)是对构建过程进行的抽象。

它包含了项目的清理初始化编译测试打包集成测试验证部署站点生成等几乎所有的构建步骤。它将项目整体划分为一个个阶段,按顺序依次执行,也可以指定执行到某个阶段,然后结束。

因为Maven的生命周期是抽象的,因此它不做任何的实际工作,全部由插件(plugin)完成。

生命周期分类:

Maven相关插件:

如今项目结构也已标准化,并符合 Maven 约定:

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

Maven 严格的约定带来的代价是它的灵活性比 Ant 少得多。目标定制非常困难,因此与 Ant 相比,编写自定义构建脚本要困难得多。

尽管 Maven 在使应用程序的构建过程更简单、更标准化方面进行了一些重大改进,但由于它的灵活性远不如 Ant,因此它仍然需要付出代价。这导致了 Gradle 的诞生,它结合了Ant 的灵活性和 Maven 的功能。


四.Gradle 

Gradle 构建工具是一种快速、可靠且适应性强的开源构建自动化工具,具有优雅且可扩展的声明式构建语言。

为什么选择Gradle?

  • Gradle 是一个广泛使用且成熟的工具,拥有活跃的社区和强大的开发者生态系统。
  • Gradle 是 JVM 中最受欢迎的构建系统,也是 Android 和 Kotlin 多平台项目的默认系统。 它拥有丰富的社区插件生态系统。
  • Gradle 可以使用其内置功能、第三方插件或自定义构建逻辑来自动化各种软件构建场景。
  • Gradle 提供了一种高级、声明性和富有表现力的构建语言,使阅读和编写构建逻辑变得容易。
  • Gradle 速度快、可扩展,可以构建任何规模和复杂性的项目。
  • Gradle 可产生可靠的结果,同时受益于增量构建、构建缓存和并行执行等优化。

关于 Gradle,我们可以注意到的第一件事是它不使用 XML 文件,这与 Ant 或 Maven 不同。

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

这被 Gradle 采用,它使用基于 Groovy 或 Kotlin 的 DSL。这导致了更小的配置文件和更少的混乱,因为该语言是专门为解决特定领域问题而设计的。Gradle 的配置文件按照惯例在 Groovy 中称为 build.gradle,在 Kotlin 中称为 build.gradle.kts

请注意,Kotlin 在自动完成和错误检测方面提供了比 Groovy 更好的 IDE 支持。

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

apply plugin: 'java'

repositories {
    mavenCentral()
}

jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}

dependencies {
    testImplementation 'junit:junit:4.12'
}

应用 Java 插件、定义项目依赖的仓库、配置生成的 JAR 文件的属性、声明项目的依赖项。可以看到依赖的设定相比起xml的写法,大大简化了写法。

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

gradle classes

从本质上讲,Gradle 有意提供很少的功能。插件添加了所有有用的功能。在我们的示例中,我们使用了 java 插件,它允许我们编译 Java 代码和其他有价值的功能。

Gradle 将其构建步骤命名为“tasks”,而不是 Ant 的“targets”或 Maven 的“phases”。在 Maven 中,我们使用了 Apache Maven 依赖插件,将依赖项复制到指定目录是一个特定目标。使用 Gradle,我们可以通过使用任务来执行相同的操作:

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

随后通过以下命令来运行任务:

gradle copyDependencies

Gradle并不是另起炉灶,它充分地使用了Maven的现有资源。继承了Maven中仓库,坐标,依赖这些核心概念。文件的布局也和Maven相同。但同时,它又继承了Ant中target的概念,我们又可以重新定义自己的任务(Gradle中叫做task)。


五.总结

在本文中,介绍了几个构建自动化工具。其中,Maven 目前占据了构建工具市场的大部分份额。

然而,Gradle 在更复杂的代码库中得到了很好的采用,原因如下:

  • 现在有很多开源项目,比如Spring,都在使用它
  • 在大多数情况下,它比 Maven 更快,这要归功于它的增量构建
  • 它提供高级分析和调试服务

但是,Gradle 似乎具有更陡峭的学习曲线,尤其是在不熟悉 Groovy 或 Kotlin 的情况下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Junwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值