在本文中,我们将探讨三个主要构建JVM生态系统的Java构建自动化工具–Ant,Maven和Gradle。
我们将介绍它们中的每一个,并探讨Java构建自动化工具是如何演变的。
最初,Make是除了自行开发的解决方案之外唯一的构建自动化工具。Make自1976年以来一直存在,因此,它在Java早期用于构建Java应用程序。
但是,C程序中的许多约定都不适合Java生态系统,所以最好将Ant作为更好的替代方案发布。
**Apache Ant(“另一个整洁的工具”)是一个Java库,用于自动化Java应用程序的构建过程。**此外,Ant可用于构建非Java应用程序。它最初是Apache Tomcat代码库的一部分,并于2000年作为独立项目发布。
在许多方面,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>
此构建文件定义了四个目标:clean,compile,jar和run。例如,我们可以通过运行来编译代码:
ant compile
这将首先触发目标清理,这将删除“classes”目录。之后,目标编译将重新创建目录并将src文件夹编译到其中。
**Ant的主要好处是它的灵活性。Ant不强加任何编码约定或项目结构。**因此,这意味着Ant要求开发人员自己编写所有命令,这有时会导致难以维护的巨大XML构建文件。
由于没有约定,只知道Ant并不意味着我们将很快理解任何Ant构建文件。习惯于使用不熟悉的Ant文件可能需要一些时间,与其他更新的工具相比,这是一个缺点。
起初,Ant没有内置的依赖管理支持。但是,由于依赖管理在以后的几年中成为必需,Apache Ivy被开发为Apache Ant项目的子项目。它与Apache Ant集成,遵循相同的设计原则。
但是,由于在使用不可管理的XML构建文件时没有内置支持依赖关系管理和挫折的初始Ant限制导致了Maven的创建。
Apache Maven是一个依赖项管理和构建自动化工具,主要用于Java应用程序。Maven继续像Ant一样使用XML文件,但是更易于管理。这里的规则名称是约定优于配置。
虽然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.0modelVersion>
<groupId>baeldunggroupId>
<artifactId>mavenExampleartifactId>
<version>0.0.1-SNAPSHOTversion>
<description>Maven exampledescription>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
project>
但是,现在项目结构已经标准化,并符合Maven惯例:
+---src
| +---main
| | +---java
| | | \---com
| | | \---baeldung
| | | \---maven
| | | HelloWorld.java
| | |
| | \---resources
| \---test
| +---java
| \---resources
与Ant相反,无需手动定义构建过程中的每个阶段。相反,我们可以简单地调用Maven的内置命令。
例如,我们可以通过运行来编译代码:
mvn compile
正如官方页面所述,Maven的核心可以被认为是一个插件执行框架,因为所有工作都是通过插件完成的。Maven支持各种可用插件,并且每个插件都可以进行额外配置。
其中一个可用的插件是Apache Maven Dependency Plugin,它具有一个复制依赖项目标,可以将我们的依赖项复制到指定的目录。
要显示此插件的运行情况,让我们在pom.xml文件中包含此插件,并为依赖项配置输出目录:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>target/dependencies
outputDirectory>
configuration>
execution>
executions>
plugin>
plugins>
build>
这个插件将在一个包阶段执行,所以如果我们运行:
mvn package
我们将执行此插件并将依赖项复制到target / dependencies文件夹。
还有一篇关于如何使用不同的Maven插件创建可执行JAR 的现有文章。此外,有关详细的Maven概述,请查看Maven的核心指南,其中探讨了Maven的一些主要功能。
Maven变得非常受欢迎,因为构建文件现在已经标准化,与Ant相比,维护构建文件的时间要少得多。但是,虽然比Ant文件更标准化,但Maven配置文件仍然会变得庞大而繁琐。
Maven的严格约定的代价是不如Ant灵活。目标定制非常困难,因此与Ant相比,编写自定义构建脚本要困难得多。
尽管Maven在使应用程序的构建过程更容易和更标准化方面取得了一些重大改进,但由于其灵活性远低于Ant,因此仍然需要付出代价。这导致了Gradle的创造,它结合了两者的优点–Ant的灵活性和Maven的功能。
Gradle是依赖关系管理和构建自动化工具,它基于Ant和Maven的概念。
关于Gradle,我们可以注意到的第一件事就是它不使用XML文件,这与Ant或Maven不同。
随着时间的推移,开发人员越来越有兴趣使用特定于域的语言 - 这简单地说,允许他们使用为特定域定制的语言来解决特定域中的问题。
这是由Gradle采用的,它使用基于Groovy的DSL 。由于该语言专门用于解决特定的域问题,因此这导致较小的配置文件较少混乱。Gradle的配置文件通常称为build.gradle。
下面是一个build.gradle文件的示例,该文件用于以前的HelloWorld主类的同一个简单Java项目:
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的“目标”或Maven的“阶段”。使用Maven,我们使用了Apache Maven Dependency Plugin,它的特定目标是将依赖项复制到指定的目录。使用Gradle,我们可以通过使用任务来做同样的事情:
task copyDependencies(type: Copy) {
from configurations.compile
into 'dependencies'
}
我们可以执行以下命令来运行此任务
gradle copyDependencies
在本文中,我们介绍了Ant,Maven和Gradle - 三种Java构建自动化工具。
毫不奇怪,Maven占据了当今构建工具市场的大部分。然而,Gradle在更复杂的代码库中得到了很好的采用,包括许多开源项目,如Spring。
参考原文: https://www.baeldung.com/ant-maven-gradle