天天看點

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>
           

    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所需的設定。