Maven入門指南(一)

Maven入門指南(一)

原文鏈接  譯文鏈接  譯者:nkcoder  校對:騰飛

Maven介紹:

Maven是一個強大的Java項目構建工具。當然,你也可以使用其它工具來構建項目,但由於Maven是用Java開發的,因此Maven被更多的用於Java項目中。

這篇教程的目的是幫助你理解Maven的工作機制。因此教程主要關注Maven的核心概念。一旦你理解了這些核心概念,當你想了解更多的細節時,再取查看Maven文檔,或者從網上搜索,就變得容易多了。

事實上,Maven開發者認爲Maven不僅僅是一個構建工具。你可以去閱讀他們的文檔Maven哲學,看看他們是怎麼想的。但是現在,我們就把Maven當作一個構建工具,當你理解和開始使用Maven後,你就明白Mavan到底是什麼了。

本教程基於Maven 3.0.5。Maven網站的地址爲:http://maven.apache.org,你可以從該網站上下載最新版的Maven,並關注項目的進展。

 

什麼是構建工具?

構建工具是將軟件項目構建相關的過程自動化的工具。構建一個軟件項目通常包含以下一個或多個過程:

  • 生成源碼(如果項目使用自動生成源碼);

  • 從源碼生成項目文檔;

  • 編譯源碼;

  • 將編譯後的代碼打包成JAR文件或者ZIP文件;

  • 將打包好的代碼安裝到服務器、倉庫或者其它的地方;

有些項目可能需要更多的過程才能完成構建,這些過程一般也可以整合到構建工具中,因此它們也可以實現自動化。

自動化構建過程的好處是將手動構建過程中犯錯的風險降到最低。而且,自動構建工具通常要比手動執行同樣的構建過程要快。

安裝Maven

安裝Maven,訪問Maven下載頁,然後按照安裝指南的步驟即可。總結一下,你需要做:
1. 下載並解壓Maven;
2. 將環境變量M2_HOME設置爲解壓後的目錄;
3. 將M2環境變量設置爲M2_HOME/bin(在Windows上是%M2_HOME%/bin,在Unix上是$M2_HOME/bin);
4. 將M2添加到PATH環境變量中(Windows上是%M2%,Unix上是$M2);
5. 打開終端輸入`mvn`(不帶引號),然後回車;

輸入‘mvn’命令後,終端上回顯示錯誤信息。不要擔心這個錯誤。因爲你沒有給Maven傳入pom文件,因此出現該錯誤信息是意料之中的。顯示Maven錯誤信息說明Maven已經安裝好了。

注意:Maven運行需要Java環境,因此也需要安裝Java,Java版本1.5及以上;

Maven概覽-核心概念

Maven的中心思想是POM文件(項目對象模型)。POM文件是以XML文件的形式表述項目的資源,如源碼、測試代碼、依賴(用到的外部Jar包)等。POM文件應該位於項目的根目錄下。

下圖說明了Maven是如何使用POM文件的,以及POM文件的主要組成部分:

maven-overview-1

這些概念先簡單地解釋一下,更多的細節放在本教程的具體小節中。

POM文件

當你執行一條Maven命令的時候,你會傳入一個pom文件。Maven會在該pom文件描述的資源上執行該命令。

構建生命週期、階段和目標

Maven的構建過程被分解爲構建生命週期、階段和目標。一個構建週期由一系列的構建階段組成,每一個構建階段由一系列的目標組成。當你運行Maven的時候,你會傳入一條命令。這條命令就是構建生命週期、階段或目標的名字。如果執行一個生命週期,該生命週期內的所有構建階段都會被執行。如果執行一個構建階段,在預定義的構建階段中,所有處於當前構建階段之前的階段也都會被執行。

依賴和倉庫

Maven執行時,其中一個首要目標就是檢查項目的依賴。依賴是你的項目用到的jar文件(java庫)。如果在本地倉庫中不存在該依賴,則Maven會從中央倉庫下載並放到本地倉庫。本地倉庫只是你電腦硬盤上的一個目錄。你可以根據需要制定本地倉庫的位置。你也可以指定下載依賴的遠程倉庫的地址。這些將會在後續的小節中詳細介紹。

插件

構建插件可以向構建階段中增加額外的構建目標。如果Maven標準的構建階段和目標無法滿足項目構建的需求,你可以在POM文件裏增加插件。Maven有一些標準的插件供選用,如果需要你可以自己實現插件。

配置文件

配置文件用於以不同的方式構建項目。比如,你可能需要在本地環境構建,用於開發和測試,你也可能需要構建後用於開發環境。這兩個構建過程是不同的。在POM文件中增加不同的構建配置,可以啓用不同的構建過程。當運行Maven時,可以指定要使用的配置。

Maven與Ant

Ant是Apache另一個流行的構建工具。如果你熟悉Ant,正在學習Maven,你將會注意到兩者在方法上的區別。

Ant使用命令式的方式,即你需要在Ant構建文件裏指定Ant應該執行的操作。你可以指定低級別的操作,如複製文件、編譯代碼等。你指定操作,還需要執行這些操作執行的順序。Ant沒有默認的目錄結構。

Maven使用聲明式的方式,即你需要在POM文件裏指定做什麼,而不是如何做。POM文件描述項目的資源-而不是如何構建。相比而言,Ant構建文件描述的是如何構建項目。在Maven裏,如何構建是在“Maven 構建聲明週期、階段和目標”中預定義的。

Maven POM 文件

Maven的POM文件是一個xml文件,描述項目用到的資源,包括源代碼目錄、測試代碼目錄等的位置,以及項目依賴的外部jar包。

POM文件描述的是構建“什麼”,而不是“如何”構建。如何構建是取決於Maven的構建階段和目標。當然,如果需要,你也可以向Maven構建階段中添加自定義的目標。

每一個項目都有一個POM文件。POM文件即pom.xml,應該放在項目的根目錄下。一個項目如果分爲多個子項目,一般來講,父項目有一個POM文件,每一個子項目都有一個POM文件。在這種結構下,既可以一步構建整個項目,也可以各個子項目分開構建。

本文剩下的章節,主要介紹POM文件最重要的部分。POM文件的完整文檔,參考[Maven POM Reference](http://maven.apache.org/pom.html)

如下爲一個最小化的POM文件示例:

<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>com.jenkov</groupId>
< artifactId>java-web-crawler</artifactId>
< version>1.0.0</version>
< /project>

*modelVersion*屬性表示使用的POM模型的版本。選擇和你正在使用的Maven版本一致的版本即可。版本4.0.0適用於Maven 2和3。

*groupId”屬性是一個組織或者項目(比如開源項目)的唯一ID。大多數情況下,你會使用項目的java包的根名稱作爲group ID。例如,對於我自己的Java網絡爬蟲項目,我會使用com.jenkov作爲group ID。如果這個項目是一個由很多獨立的貢獻者組成的開源項目,也許選擇與項目相關的名稱作爲group ID,比選擇與我的公司相關的名稱名作爲group ID要合理地多。因此,選擇com.javawebcrawler作爲group ID。

groupId不一定非要使用Java的包名,也不一定要使用.分隔符來分隔ID中的詞。但是,如果你這麼使用,項目將會位於Maven倉庫的結構化目錄中,該結構化目錄與group ID匹配。每一個.是一個目錄分隔符,每一個詞都表示一個目錄。group ID爲com.jenkov的項目將位於目錄MAVEN_REPO/com/jenkov中。目錄路徑中的MAVEN_REPO表示Maven倉庫的路徑。

*artifactId*屬性包含你正在構建的項目的名稱。以我的Java網絡爬蟲項目來說,artifact ID爲java-web-crawler。artifact ID是Maven倉庫中group ID目錄下的子目錄名。artifact ID也是構建完項目後生成的jar包的文件名的一部分。構建過程的輸出,即構建結果,在Maven中成爲構件(artifact)。通常它就是一個jar包、war包或者EAR包,蛋它也可以是別的。

*versionId包含項目的版本號。如果你的項目有不同的發行版,比如開源API,對構建過程版本化是很有用的。如果使用版本,項目的用戶就可以查看項目的具體版本。版本號是artifact ID目錄下的子目錄名。版本號也用作構建結果名稱的一部分。(即jar包文件名的一部分–譯者注)

上文中的groupId,artifactId和version屬性,在項目構建後會生成一個jar文件,位於Maven倉庫的如下路徑中(目錄和文件名):MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar

如果你的項目使用[Maven目錄結構](http://tutorials.jenkov.com/maven/maven-tutorial.html#maven-directory-structure),而且項目沒有外部依賴,上面的最簡化POM文件就是你構建項目所需的所有配置了。

如果你的項目不遵從標準的目錄結構,有外部依賴或者在構建過程中需要加入額外操作,你需要向POM文件中添加更多的配置。更多的配置查閱[Maven POM 參考](鏈接在上文)。

通常,你可以向POM文件中增加各種配置,這些配置告訴Maven如何更好地構建你的項目。查閱Maven的POM參考,瞭解更多的配置。

父pom

所有的Maven pom文件都繼承自一個父pom。如果沒有指定父pom,則該pom文件繼承自根pom。pom文件的繼承關係如下圖所示:

super-pom

可以讓一個pom文件顯式地繼承另一個pom文件。這樣,可以通過修改公共父pom文件的設置來修改所有子pom文件的設置。在pom文件的起始處指定父pom,例如:

<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>

<parent>
< groupId>org.codehaus.mojo</groupId>
< artifactId>my-parent</artifactId>
< version>2.0</version>
< relativePath>../my-parent</relativePath>
< /parent>

<artifactId>my-project</artifactId>

</project>

子pom文件的設置可以覆蓋父pom文件的設置,只需要在子pom文件裏指定新的設置即可。
關於pom文件繼承更詳細的內容可以參考Maven POM文檔。

有效pom

考慮到pom文件的繼承關係,當Maven執行的時候可能很難確定最終的pom文件的內容。總的pom文件(所有繼承關係生效後)被稱爲有效pom(effective pom)。可以使用以下的命令讓Maven打印出當前的有效pom:

mvn help:effective-pom

執行以上命令,Maven會將有效pom輸出到命令行。

Maven配置文件

Maven有兩個配置文件。配置文件裏的設置,對所有的pom文件都是有效的。比如,你可以配置:

  • 本地倉庫的路徑;

  • 當前的編譯配置選項

  • 等等

配置文件名爲settings.xml,兩個配置文件分別爲:

+ Maven安裝目錄中:$M2_HOME/conf/settings.xml
+ 用戶主目錄中:${user.home}/.m2/settings.xml

兩個配置文件都是可選的。如果兩個文件都存在,則用戶目錄下的配置會覆蓋Maven安裝目錄中的配置。

關於Maven配置文件,參考[Maven配置文檔](http://maven.apache.org/settings.html)

讓Maven跑起來

當你安裝好了Maven,並且在項目的根目錄下創建了POM文件,可以在項目上運行Maven了。

運行Maven只需在命令行執行`mvn`命令即可。當執行`mvn`命令時,將構建週期、階段或目標作爲參數傳進去,Maven就會執行它們。例如:

mvn install

該命令執行`install`階段(是默認構建階段的一部分),編譯項目,將打包的JAR文件複製到本地的Maven倉庫。事實上,該命令在執行install之前,會執行在構建週期序列中位於install之前的所有階段。

你可以向mvn命令傳入多個參數,執行多個構建週期或階段,如:

mvn clean install

該命令首先執行clean構建週期,刪除Maven輸出目錄中已編譯的類文件,然後執行install構建階段。

也可以執行一個Maven目標(構建階段的一部分),將構建階段與目標名以冒號(:)相連,作爲參數一起傳給Maven命令。例如:

mvn dependency:copy-dependencies

該命令執行`dependency`構建階段中的`copy-dependencies`目標。

 

原創文章,轉載請註明: 轉載自併發編程網 – ifeve.com本文鏈接地址: Maven入門指南(一)


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