Maven系列 1. Maven入門

Maven入門
  
    像其他工匠一樣,軟件開發人員依靠他們的工具來構建應用程序。開發人員的集成開發環境(IDE),錯誤跟蹤工具,構建工具,框架和調試工具(如內存分析器)在日常開發和質量軟件維護中發揮着至關重要的作用。這本書將討論和探索Maven的功能,我們知道這將成爲您的軟件開發武器庫中的一個重要工具。
    Apache Maven是一個開源的,基於標準的項目管理框架,簡化了項目的構建,測試,報告和打包。 Maven最初的根源是在2000年初發生的Apache Jakarta Alexandria項目中。它隨後在Apache Turbine項目中使用。與當時許多其他Apache項目一樣,Turbine項目有幾個子項目,每個子項目都有自己的基於Ant的構建系統。當時,人們強烈希望開發一種標準方法來構建項目並在項目之間輕鬆共享生成的工件。這個願望誕生了Maven。 Maven 1.0版本於2004年發佈,其次是2005年的2.0版本。在編寫本書時,3.0.5是Maven的當前版本。
    Maven已經成爲全球企業中最廣泛使用的開源軟件程序之一。讓我們來看看爲什麼Maven如此受歡迎的一些原因。


    標準化目錄結構

    通常,當我們開始處理新項目時,花費大量時間來決定存儲代碼和配置文件所需的項目佈局和文件夾結構。這些決策在不同項目和團隊之間差異很大,這使得新開發人員很難理解和採用其他團隊的項目。它還可以使現有開發人員難以在項目之間跳轉,並找到他們正在尋找的東西。
    Maven通過標準化文件夾結構和項目的組織來解決上述問題。 Maven提供了關於項目的不同部分(例如源代碼,測試代碼和配置文件)應位於何處的建議。例如,Maven建議將所有Java源代碼放在src \ main \ java文件夾中。這使得更容易理解和導航任何Maven項目。
    此外,這些約定使您可以輕鬆地切換到並開始使用新的IDE。歷史上,IDE因項目結構和文件夾名稱而異。 Eclipse中的動態Web項目可能使用WebContent文件夾來存儲Web資產,而NetBeans可能會將Web頁面用於相同的目的。使用Maven,您的項目遵循一致的結構,併成爲IDE不可知。

    聲明依賴管理
    大多數Java項目依賴其他項目和開源框架來正常運行。手動下載這些依賴項可能很麻煩,並在項目中使用它們時跟蹤它們的版本。
    Maven提供了一種方便的方法在單獨的外部pom.xml文件中聲明這些項目依賴項。然後它會自動下載這些依賴項,並允許您在項目中使用它們。這大大簡化了項目依賴管理。重要的是要注意,在pom.xml文件中,你指定的是什麼,而不是如何。 pom.xml文件還可以用作文檔工具,傳達項目依賴項及其版本。

    插件
    Maven遵循基於插件的架構,使其易於擴展和自定義其功能。這些插件封裝了可重用的構建和任務邏輯。今天,有數以百計的Maven插件可用於執行從代碼編譯到打包到項目文檔生成的任務。

    Maven還可以輕鬆創建自己的插件,從而使您能夠集成特定於組織的任務和工作流程。


統一構建抽象
    Maven爲構建項目提供了統一的接口。你可以使用一些命令來構建一個Maven項目。一旦你熟悉了Maven的構建過程,你可以很容易地弄清楚如何構建其他Maven項目。這使開發者不必學習構建特性,因此他們可以更專注於開發。

    工具支持
    Maven提供了強大的命令行界面來執行不同的操作。所有主要的IDE今天爲Maven提供了極好的工具支持。此外,Maven與當今的連續集成產品(如Jenkins,Bamboo和Hudson)完全集成。

    原型
    正如我們已經提到的,Maven爲其項目提供了標準的目錄佈局。當創建一個新的Maven項目時,你需要手動構建每個目錄,這很容易變得乏味。這是Maven原型來救援。 Maven原型是可用於生成新項目的預定義項目模板。使用原型創建的項目將包含所有您需要的文件夾和文件。
    Archetypes也是捆綁最佳實踐和常見資產的有用工具,您將在每個項目中使用它們。考慮一個專注於基於Spring框架的Web應用程序的團隊。所有基於Spring的Web項目都共享相同的依賴關係,並需要一組Spring配置文件。所有這些Web項目也極有可能具有類似的Log4j / Logback配置文件,CSS / Images和Apache Tile佈局或SiteMesh裝飾器。 Maven允許這個團隊將這些常見資產捆綁成原型。當使用此原型創建新項目時,它們將自動包含公共資產。不再需要複製和粘貼或拖放。

    開源
Maven是開源的,無需下載和使用。它具有豐富的在線文檔和活躍社區的支持。此外,Sonatype等公司還爲Maven生態系統提供商業支持。
    
      公約超過配置
      約定慣例配置(CoC)或按慣例編碼是Maven的主要租戶之一。通過Ruby on Rails社區的推廣,CoC強調合理的默認值,從而減少了作出決定的數量。它節省時間並且還導致更簡單的最終產品,因爲所需的配置量大大減少。
      作爲其CoC遵守的一部分,Maven爲其項目提供了幾個明智的默認值。它提供了一個標準目錄結構,併爲生成的工件提供了默認值。想象一下用名爲log4j-1.4.3.jar的Maven工件。一目瞭然,您可以很容易地看到,您正在查看log4j JAR文件,版本1.4.3。
      Maven的CoC的一個缺點是最終用戶在使用它時的剛性。爲了解決這個問題,你可以自定義Maven的大多數默認值。例如,可以更改項目中Java源代碼的位置。然而,作爲經驗法則,應該將對默認值的這種改變最小化。
    
    Maven替代品
    雖然本書的重點是Maven,讓我們來看看它的幾個替代品:Ant + Ivy和Gradle。

    螞蟻+常春藤
    Apache Ant(http://ant.apache.org)是用於構建腳本的流行的開源工具。 Ant是基於Java的,它使用可擴展標記語言(XML)進行配置。 Ant的默認配置文件是build.xml文件。
    使用Ant通常涉及定義任務和目標。顧名思義,Ant任務是需要完成的工作單元。典型的任務包括創建目錄,運行測試,編譯源代碼,構建Web應用程序歸檔(WAR)文件等。目標只是一組任務。目標可能依賴於其他目標。這種依賴性使我們可以順序執行目標。清單1-1演示了一個簡單的build.xml文件,其中一個目標稱爲compile。編譯目標有兩個echo任務和一個javac任務。
    列表1-1。示例Ant build.xml文件

<project name="Sample Build File" default="compile" basedir=".">   
<target name="compile" description="Compile Source Code">      
<echo message="Starting Code Compilation"/>      
<javac srcdir="src" destdir="dist"/>      
<echo message="Completed Code Compilation"/>   
</target>
</project>

Ant不會對您的項目施加任何約定或限制,並且它是非常靈活的。這種靈活性有時導致複雜,難以理解和維護build.xml文件。

    Apache Ivy(http://ant.apache.org/ivy/)提供了自動的依賴關係管理,使得Ant更快樂地使用。使用Ivy,您可以在名爲ivy.xml的XML文件中聲明依賴關係,如清單1-2所示。將Ivy與Ant集成涉及在build.xml文件中聲明新目標以檢索和解析依賴關係。

    清單1-2。樣本常春藤列表

<ivy-module version="2.0">  
<info organisation="com.apress" module="gswm-ivy" /> 
 <dependencies>        
<dependency org="org.apache.logging.log4j" name="log4j-api" rev="2.0.2" /> 
 </dependencies>
</ivy-module>

Gradle
    Gradle(http://gradle.org/)是Java構建項目自動化工具系列中最新的一個。與使用XML進行配置的Ant和Maven不同,Gradle使用基於Groovy的域特定語言(DSL)。
    Gradle提供了Ant的靈活性,它使用相同的任務概念。它也遵循Maven的約定和依賴管理風格。清單1-3顯示了一個默認的build.gradle文件。
    清單1-3。默認build.gradle文件
apply plugin: 
'java'version = '1.0'
repositories {
   mavenCentral()}
dependencies {    
		testCompile group: 'junit', name: 'junit', version: '4.10'
	}
Gradle的DSL及其對CoC的堅持導致緊湊的構建文件。清單1-3中的第一行包括一個用於構建的Java插件。 Gradle中的插件爲項目提供預配置的任務和依賴項。例如,Java插件提供了構建源文件,運行單元測試和安裝工件的任務。 default.build文件中的dependencies部分指示Gradle在編譯測試源文件期間使用JUnit依賴關係。 Gradle的靈活性,像螞蟻的靈活性,可以被濫用,這導致困難和複雜的構建。


總結
    Apache Maven極大地簡化了構建過程並自動化了項目管理任務。本章對Maven進行了溫和的介紹,並描述了採用它的主要原因。我們還看了Maven的同行:Ant + Ivy和Gradle。
    在下一章中,您將瞭解啓動和運行Maven所需的設置。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章