Java构建工具:Ant vs. Maven vs Gradle
最初,Make是唯一可用的構建工具。 后來通過GNU Make進行了改進。 但是,從那時起,我們的需求增加了,結果,構建工具也不斷發展。
JVM生態系統主要由三個構建工具組成:
- 常春藤的 Apache Ant
- 馬文
- 搖籃
Ant是“現代”構建工具中的第一個。 在許多方面,它類似于Make。 它于2000年發布,并在短時間內成為Java項目最受歡迎的構建工具。 它的學習曲線非常低,因此任何人都可以在無需任何特殊準備的情況下開始使用它。 它基于過程編程思想。
最初發行后,它通過接受插件的功能得到了改進。
主要缺點是將XML作為編寫構建腳本的格式。 XML本質上是分層的,因此不適合Ant使用的過程編程方法。 Ant的另一個問題是,與非常小的項目一起使用時,其XML往往變得難以管理。
后來,由于必須通過網絡進行依賴管理,Ant采用了Apache Ivy 。
Ant的主要好處是對構建過程的控制。
Maven于2004年發布。其目標是改善開發人員在使用Ant時面臨的一些問題。
Maven繼續使用XML作為編寫構建規范的格式。 但是,結構截然不同。 盡管Ant要求開發人員編寫所有導致成功執行某些任務的命令,但Maven依賴于約定并提供了可以調用的可用目標(目標)。 作為附加的,可能也是最重要的附加功能,Maven引入了通過網絡下載依賴項的功能(后來由Ant通過Ivy采納)。 這本身就徹底改變了我們交付軟件的方式。
但是,Maven有其自身的問題。 依賴關系管理不能很好地處理同一庫的不同版本之間的沖突(Ivy更擅長于此)。 XML作為構建配置格式經過嚴格的結構化和高度標準化。 目標(目標)的定制很難。 由于Maven主要關注于依賴關系管理,因此,與在Ant中相比,在Maven中編寫復雜,自定義的構建腳本實際上更加困難。
用XML編寫的Maven配置連續又繁瑣。 在較大的項目中,它可以具有數百行代碼,而無需實際執行“非凡”的工作。
Maven的主要好處是其生命周期。 只要該項目基于某些標準,就可以使用Maven相對輕松地貫穿整個生命周期。 這是以靈活性為代價的。
同時,對DSL(特定領域語言)的興趣持續增長。 這個想法是讓語言被設計用來解決屬于特定領域的問題。 在構建的情況下,應用DSL的結果之一就是Gradle。
Gradle結合了這兩種工具的優點,并在它們之上進行了DSL和其他改進。 它具有Ant的功能和靈活性,并具有Maven的生命周期和易用性。 最終結果是該工具于2012年發布,并在短時間內引起了廣泛關注。 例如,谷歌采用Gradle作為Android OS的默認構建工具。
Gradle不使用XML。 相反,它具有基于Groovy (JVM語言之一)的自己的DSL。 結果,Gradle構建腳本往往比為Ant或Maven編寫的腳本更短,更清晰。 Gradle的樣板代碼量要少得多,因為它的DSL是為解決特定問題而設計的:在軟件的整個生命周期中移動軟件,從編譯到靜態分析和測試,再到打包和部署。
它使用Apache Ivy來滿足JAR依賴關系。
搖搖晃晃的努力可以總結為“聚會好,靈活性也好”。
代碼示例
我們將創建構建腳本,這些腳本將進行編譯,執行靜態分析,運行單元測試以及最終創建JAR文件。 我們將在所有三個框架(Ant,Maven和Gradle)中進行這些操作,并比較語法。 通過比較每個任務的代碼,我們將能夠更好地理解差異并就構建工具的選擇做出明智的決定。
首先是第一件事。 如果您要自己完成本文中的示例,則需要安裝Ant , Ivy , Maven和Gradle 。 請按照這些工具制造商提供的安裝說明進行操作。 您可以選擇不自己運行示例,而完全跳過安裝。 代碼段應該足以使您了解每種工具的工作原理。
代碼存儲庫https://github.com/vfarcic/JavaBuildTools包含Java代碼(兩個帶有相應測試的簡單類),checkstyle配置以及Ant,Ivy,Maven和Gradle配置文件。
讓我們從Ant和Ivy開始。
螞蟻與常春藤
常春藤依賴項需要在ivy.xml文件中指定。 我們的示例非常簡單,僅需要JUnit和Hamcrest依賴項。
[ ivy.xml ]
<ivy-module version="2.0"><info organisation="org.apache" module="java-build-tools"/><dependencies><dependency org="junit" name="junit" rev="4.11"/><dependency org="org.hamcrest" name="hamcrest-all" rev="1.3"/></dependencies> </ivy-module>現在,我們將創建我們的Ant構建腳本。 它的任務只是編譯一個JAR文件。 最終結果是以下build.xml。
[ build.xml ]
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="java-build-tools" default="jar"><property name="src.dir" value="src"/><property name="build.dir" value="build"/><property name="classes.dir" value="${build.dir}/classes"/><property name="jar.dir" value="${build.dir}/jar"/><property name="lib.dir" value="lib" /><path id="lib.path.id"><fileset dir="${lib.dir}" /></path><target name="resolve"><ivy:retrieve /></target><target name="clean"><delete dir="${build.dir}"/></target><target name="compile" depends="resolve"><mkdir dir="${classes.dir}"/><javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id"/></target><target name="jar" depends="compile"><mkdir dir="${jar.dir}"/><jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"/></target></project>首先,我們指定幾個屬性。 從那里開始,一項任務接another而至。 我們使用Ivy來解決依賴關系,清理,編譯并最終創建JAR文件。 幾乎每個Java項目都需要執行的任務需要大量的配置。
要運行創建JAR文件的Ant任務,請執行以下操作。
ant jar讓我們看看Maven將如何執行相同的任務集。
馬文
[ pom.xml ]
<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.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.technologyconversations</groupId><artifactId>java-build-tools</artifactId><packaging>jar</packaging><version>1.0</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>1.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version></plugin></plugins></build></project>要運行創建JAR文件的Maven目標,請執行以下操作。
mvn package主要區別在于,使用Maven,我們不需要指定應該做什么。 我們不是在創建任務,而是在設置參數(依賴項是什么,要使用哪些插件……)。 這顯示了Ant和Maven之間的主要區別。 后來提倡使用約定,并提供現成的目標(目標)。 隨著時間的流逝,Ant和Maven XML文件都會變得越來越大。 為了說明這一點,我們將添加Maven CheckStyle,FindBugs和PMD插件,這些插件將負責靜態分析。 這三個都是相當標準的工具,在許多Java項目中都以一種或另一種形式使用。 我們希望將所有靜態分析作為單個目標的一部分與單元測試一起進行驗證 。 此外,我們應指定自定義checkstyle配置的路徑,并確保其在出錯時失敗。 其他Maven代碼如下:
[ pom.xml ]
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-checkstyle-plugin</artifactId><version>2.12.1</version><executions><execution><configuration><configLocation>config/checkstyle/checkstyle.xml</configLocation><consoleOutput>true</consoleOutput><failsOnError>true</failsOnError></configuration><goals><goal>check</goal></goals></execution></executions> </plugin> <plugin><groupId>org.codehaus.mojo</groupId><artifactId>findbugs-maven-plugin</artifactId><version>2.5.4</version><executions><execution><goals><goal>check</goal></goals></execution></executions> </plugin> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><version>3.1</version><executions><execution><goals><goal>check</goal></goals></execution></executions> </plugin>要運行使用CheckStyle,FindBugs和PMD運行單元測試和靜態分析的Maven目標,請執行以下命令。
mvn verify我們必須編寫許多XML,這些XML可以完成一些非?;厩页S玫娜蝿占?。 在具有更多依賴項和任務的真實項目中,Maven pom.xml文件可以輕松到達數百甚至數千行XML。
這是Gradle中的外觀。
搖籃
[ build.gradle ]
apply plugin: 'java' apply plugin: 'checkstyle' apply plugin: 'findbugs' apply plugin: 'pmd'version = '1.0'repositories {mavenCentral() }dependencies {testCompile group: 'junit', name: 'junit', version: '4.11'testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' }Gradle代碼不僅比Maven短得多,而且對熟悉Gradle的人來說比Maven更容易理解,而且實際上引入了許多有用的任務,而這些正是我們剛剛編寫的Maven代碼所沒有的。 要獲取Gradle可以使用當前配置運行的所有任務的列表,請執行以下操作。
gradle tasks --all清晰度,復雜性和學習曲線
對于新手來說,Ant是所有工具中最清晰的工具。 只需閱讀配置XML,就可以了解它的作用。 但是,編寫Ant任務很容易變得非常復雜。 Maven,特別是Gradle,具有許多現成可用的或通過插件提供的任務。 例如,通過看下面的一行,對于那些不了解Gradle之謎的人來說可能不清楚,哪些任務將被解鎖以供我們使用。
[build.gradle]
apply plugin: 'java'這行簡單的代碼添加了20多個任務,等待我們使用。
在我看來,Ant的可讀性和Maven的簡單性是錯誤的論點,它們僅在短暫的最初Gradle學習曲線中適用。 一旦使用了Gradle DSL,它的語法就會比Ant或Maven使用的語法更短,更容易理解。 而且,只有Gradle提供約定和命令創建。 盡管可以用Ant任務擴展Maven,但它很乏味且效率不高。 Groovy的Gradle將其提升到一個新的水平。
下一篇文章將更深入地介紹Gradle,并更詳細地說明其與Groovy的集成。
翻譯自: https://www.javacodegeeks.com/2014/06/java-build-tools-ant-vs-maven-vs-gradle.html
總結
以上是生活随笔為你收集整理的Java构建工具:Ant vs. Maven vs Gradle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XP系统Chkdsk工具怎么修复C盘?磁
- 下一篇: 电信光宽带怎么设置路由器(电信光宽带怎么