前言
在这篇文章,我们比较在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。