Maven起步-教你開始使用Maven

來源:互聯網
上載者:User
 摘要:Maven1.0已經曆了幾年的時間,並且作為Ant的替代品已被廣大的開發人員所接收,但它並沒有在很大程度使開發人員從Ant的
build.xml檔案中解脫出來。Maven1.0速度慢並且笨拙,使用起來的困難度並不亞於使用Ant的項目。事實上,它的核心是基於Ant實現的。
在經過了幾乎徹底的重寫後,Maven2.0誕生了。

一個Java項目中最困難的地方就是如何著手啟動它。在啟動項目之前,我們必須配置
好所有的邏輯關係。比如,Java原始碼應該放在何處?單元測試應該在何處進行?依賴的jar包應該如何放置?如何構建項目,如何形成文檔,如何測試和部
署項目?在這種情況下,開發人員不同的處理選擇將會影響項目的餘下部分。您的選擇可能會使你陷入困境,也可能會在將來證明您是一位Java架構大師。我們
假定後者是我們奮鬥的目標,接下來就進入我們的正題。

構建一個Java項目可以使用很多工具,其中包括Ant。Ant作為一款具有革命性
的工具,一直是眾多開發人員使用工具中的首選,它能使開發人員擺脫使用大量make命令的苦海。對於那些不太熟悉make命令的人來說,他們有充足的理由來
表明使用命令並不是構建Java項目的最好工具,因為它不具備平台獨立性並且不易使用。Ant的出現解決了以上的問題,它使用了一個平台獨立的工具,該工
具能夠解析XML設定檔,即build.xml。雖然Ant由於其諸多的優點而備受歡迎,但它同樣有一些缺點。build.xml檔案由於採用了極其簡
短的描述方式,使得開發人員需要預先學習它的文法。雖然學習曲線不是很陡峭,但Java開發人員更應該把時間放在開發上面。

Maven是
新一代的生力軍,它的境遇正好和幾年前的Ant十分類似。Maven1.0已經曆了幾年的時間,並且作為Ant的替代品已被廣大的開發人員所接收,但它並
沒有在很大程度使開發人員從Ant的build.xml檔案中解脫出來。Maven1.0速度慢並且笨拙,使用起來的困難度並不亞於使用Ant的項目。事
實上,它的核心是基於Ant實現的。在經過了幾乎徹底的重寫後,Maven2.0誕生了。

著作權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者資訊和連結
作者:Chris Hardin;mycj(作者的blog:http://blog.matrix.org.cn/page/mycj)
原文:http://www.onjava.com/pub/a/onjava/2006/03/29/maven-2-0.html
Matrix:http://www.matrix.org.cn/resource/article/44/44475_Maven2.html
關鍵字:Maven2

Maven2.0的優點

Maven2.0有許多很好功能,這些功能不僅僅是協助您構建項目。如果您剛剛開始啟動一個Java項目,並且想使該項目快速地開展下去,Maven2.0能夠在幾分鐘內達到您的要求。以下是Maven2.0的一些優點:
--標準的項目布局和項目結構產生器
--標準的依賴管理機制
--多項目支援
--在開發人員需要的時候及時地下載新的外掛程式和功能組件
--產生最新項目資訊的網站
--整合了原始碼控制軟體:CVS和Subversion

以上列表展示的只是Maven2.0特點中的一小部分。但這足以使Maven2.0成為一個構建管理系統可靠的選擇。既然我們已經知道Maven是個什麼東西了,接下來讓我們看看如何使用它。

入門


們要做的第一件事情就是設定目錄結構,但這並不需要讓我們手動設定,Maven會根據您開發的項目類型來為您做這件事。一旦您下載並解壓了最新發行的
Maven 2.0,您應該將Maven所在目錄下面的bin目錄添加到您的系統路徑下。您可以運行命令mvn -version來測試您的安裝。

既然已經安裝上了工具,讓我們看看建立一個簡單的Java項目的例子。Maven使用原型來決定目錄結構是如何展現的。Maven內建了幾個內建的原型,您也可以自訂原型。

mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app

您看,這就產生了我們的項目布局。
my-app
----src
    ----main
        ----java
           ----com
               ----oreilly
    ----test
        ----java
            ----com
                ----oreilly

對,
就這麼簡單。這種目錄結構可以通過建立一個新的原型來覆寫,但並不推薦這麼做,因為Maven的一個優點就是使用標準的目錄結構。該目錄結構包含兩個源代
碼樹,一個是Java應用程式的原始碼,另一個是單元測試代碼。同時您也許會注意到,當第一次運行Maven的時候,它會進行一些下載工作。當您開始調用
工具時,Maven會根據您使用的外掛程式來更新自身的一些所需功能。Maven預設會從Ibiblio存放庫中得到更新。您可以在Maven安裝目錄下的
conf目錄中,或者項目自身中修改Maven遠程存放庫的選擇。
您會發現Maven在my-app目錄下建立了一個pom.xml檔案。這是項
目的最基本部分。pom.xml檔案包含了一組指令,這些指令告訴Maven如何構建項目和包含哪些其它的特殊指令(POM是“項目物件模型”的縮寫)。
在預設的情況下,Maven包含了JUnit的依賴以此來鼓勵單元測試。

<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/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.oreilly</groupId>  <artifactId>my-app</artifactId>  <packaging>jar</packaging>  <version>1.0-SNAPSHOT</version>  <name>Maven Quick Start Archetype</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  </dependencies></project>

建立完項目後,我們可以往項目裡添加代碼並使用Maven的所有全新技巧。注意以下命令必須在pom.xml檔案所在的目錄中運行。
--mvn test:運行應用程式中的單元測試
--mvn package:依據項目產生jar檔案
--mvn install:將項目的jar檔案添加到庫中,        以備依賴此項目時使用
--mvn site:產生項目相關資訊的網站
--mvn clean:清除目標目錄中的產生結果
--mvn eclipse:eclipse:產生Eclipse專案檔

接下來我們看看稍微複雜點的地方,我們知道手動開始一個Java web項目比手動開始一個簡單的Java項目更耗時,然而Maven的使用則能化難為易。下面的例子(實際上是一行命令)展現了項目結構的構造。
mvn archetype:create -DgroupId=com.oreilly
    -DartifactId=Oreilly
    -DarchetypeArtifactId=maven-archetype-webapp

產生的結果結構如下所示:
Oreilly
----src
    ----main
        ----resources
        ----webapp
            ----WEB-INF


一次,我們的項目由於支援了將包含在war檔案中的web資源而設定有所不同。pom.xml檔案中將包含一行來表明項目應該被打包成war文
件:<packaging>war</packaging>。現在就可以使用mvn package命令來產生war檔案。不用
擔心如何從WEB-INF/lib目錄中得到依賴項,在相依性屬性值被設定成compile的情況下,Maven會自動包含依賴項。也可以將以下代碼添加到
pom.xml檔案中來改變war檔案的名稱:

<build>    <finalName>PromoteC</finalName> </build>

依賴管理


建好項目結構,添加完一些代碼,測試並編譯好應用程式後,接下來可以看看Maven是如何處理依賴關係的。為了給項目添加一個依賴項,必須將此依賴項添加
到pom.xml檔案中。下次運行Maven的時候,它將從Ibiblio存放庫中得到這個依賴項,並且將此依賴項添加到項目構建路徑中。


於依賴的問題有幾個重要的事情值得注意。在寫這篇文章的時候,Maven中最大的麻煩之處就是不能從Maven存放庫中擷取Sun的jar檔案。這個問題
歸因於Sun在其代碼中設定的許可證限制。解決這個問題的辦法有兩種,一種是下載這些代碼並將它們安裝在您本地的存放庫中,另一種是做一個外部聲明,並將
這個聲明指向檔案系統中依賴項所在的位置。希望Sun能夠儘早地建立自己的存放庫,儘管如此,Maven也會被升級來使之能夠下載這些資源,只是在下載之
前它會提示使用者接受許可證協議。

另外一個麻煩的地方就是有時候使用的最新的庫檔案可能在遠程存放庫中不存在。另一種可能是由於無法訪問
Internet,需要所有的依賴項都能在本地擷取。這些問題的最好解決方案就是將jar檔案安裝到本地的存放庫中。將本地的存放庫放在一台web伺服器
上也同樣是個便利之舉,這樣整個Team Dev就能從此獲益,每個人都沒有必要去管理自己的存放庫了。改變Maven的存放庫路徑只需簡單地編輯其安裝目錄下
conf檔案夾下面的settings.xml檔案即可。

在Maven中使用依賴是簡單的。讓我們看看往上述pom.xml檔案中添加一
個依賴項的情況。我們雖然已經使用了JUnit,但讓我們將功能強大的Quartz庫添加到項目中。Quartz是一款用純Java編寫的關於時間安排的
開源項目,它是您時間安排需求方面的很好的選擇。

<dependency>   <groupId>quartz</groupId>   <artifactId>quartz</artifactId>   <version>1.5.1</version>   <scope>compile</scope> </dependency>


們僅僅只需添加<dependencies>這個元素,Maven就能下載Quartz並將其作為項目中的一個依賴項。不用擔心Quartz
的依賴項,一個Maven的存放庫將包含依賴項自身依賴的資源資訊,當Maven下載Quartz的時候,它自身的依賴資源也同樣會被下載。為了驗證版本
為1.5.1的Quartz存在於Ibiblio庫中,我們可以瀏覽Maven存放庫。注意到scope參數的使用,它告訴了Maven依賴項在何種階段
是所需的。在使用JUnit的情況下,我們設定scope參數的值為test來告訴Maven這個依賴項只是在測試階段所需的,而不是運行時所需的資源。
以下是scope參數值的說明:
--compile:預設值。表明是所有任務所需的資源
--test:運行所有的測試案例時所需資源
--runtime:表明是運行時所需資源
--provided:JDK部分或應用伺服器的classpath所需的資源


在,如何處理那些麻煩的Sun的jar包和那些需要但卻不能在遠程存放庫中找到的jar包了?我們必須使用Maven來手動將這些jar包安裝到本地的存
儲庫中。不用擔心,這沒有聽上去那麼困難。為了做個樣本,我們將安裝Java Activation架構的jar包。首先我們必須從Sun的網站上下載此
jar包,接著我們使用Maven將它匯入本地的存放庫中。您自己也可以按照Maven上傳資源指南中的指導將缺少的jar包安裝到Ibiblio中。
mvn install:install-file -Dfile=activation.jar
    -DgroupId=javax.activation -DartifactId=activation
    -Dversion=1.0 -Dpackaging=jar


在,新的jar包就像其它的項目依賴項一樣安裝到了本機存放區庫中。在只需添加依賴聲明後,我們就已準備就緒了。在添加jar包和聲明它們為依賴項時,必須
確保版本資訊的正確性。版本的不匹配會導致Maven在尋找資源時的失敗。在匯入Sun的jar包時,如果您需要尋求標準具名引數的協助,可以參考Sun
標準jar包命名。記住,在目前您不能通過存放庫來公開發布這些jar包,這將違反Sun的使用規定。

<dependency>   <groupId>javax.activation</groupId>   <artifactId>activation</artifactId>   <version>1.0</version>   <scope>compile</scope> </dependency>


或許想將依賴項存入一個原始碼控制器的庫中,原始碼控制器決不能執行這個任務。依賴項是經常變化的,並且通常有一套數字方案來標明其版本。這就是說,您明
確地希望有一個內部遠程存放庫的備份,如果您有一個,這將確保在存放庫伺服器崩潰並且不能恢複的情況下,您不會丟失所有的自訂資源。不將依賴項放入源代
碼控制器中也會節省原始碼控制器的存放庫伺服器上的大量磁碟空間。

配置存放庫

要求項目的每個開發人員必須在conf目錄中
配置存放庫是不方便的,所以Maven可以同時查看多個存放庫並且將它們全部配置在pom.xml檔案中。讓我們看看一個例子,它展示了如何在應用程式用
使用多個存放庫。在以下從pom.xml檔案摘錄的片斷中,我們設定了兩個存放庫來讓Maven尋找依賴項。Ibiblio一直是預設的存放庫,我們又添
加了Planet Mirror作為後援存放庫。我們也可以讓團隊使用的本地web伺服器作為第二個存放庫。

<repositories>    <repository>      <id>Ibiblio</id>      <name>Ibiblio</name>      <url>http://www.ibiblio.org/maven/</url>    </repository>    <repository>      <id>PlanetMirror</id>      <name>Planet Mirror</name>      <url>http://public.planetmirror.com/pub/maven/</url>    </repository>  </repositories>

使用pom.xml父檔案來構建多重專案


件公司通常的一種做法就是將多重專案構建到主要產品中。維護依賴關係鏈和一次性地構建整個產品足以成為一個挑戰,但是如果使用Maven的話,事情將變得
簡單。如果您建立了一個指向其它子模組的pom.xml父檔案,Maven將為您處理整個構建過程。它將分析每個子模組的pom.xml檔案,並且按照這
些子模組的相互依賴順序來構建項目。如果每個項目明確地指明它們的依賴項,那麼子模組在父檔案中的放置順序是不造成任何影響的。但是考慮到其他的開發人員,
最好保證子模組在pom.xml父檔案中的放置順序和您期望的子項目被構建的順序一樣。下面我們看個樣本。
pom.xml主檔案如下:

<project>  <modelVersion>4.0.0</modelVersion>  <groupId>com.oreilly</groupId>  <version>1.0-SNAPSHOT</version>  <artifactId>my-app</artifactId>  <packaging>pom</packaging>  <modules>    <module>Common</module>    <module>Utilities</module>    <module>Application</module>     <module>WebApplication</module>  </modules></project>


們需要確保WebApplication子模組包含了所有的三個jar包,所以需要將這些jar包聲明為依賴項。在這個例子中,Utilities項目依
賴於Common項目,所以Utilities項目中需要添加一個對Common項目的依賴。Application子模組也是同樣的道理,因為它依賴於
Common和Utilities項目,Utilities又賴於Common。如果這個例子中有60個子模組,並且它們都相互依賴,這會使得新開發人員難
以算出什麼項目依賴於其它項目,所以這正好是要求確保pom.xml父檔案中項目放置順序要清除的原因。

以下是Utility模組的依賴項:

<dependencies>    <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Common</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>  </dependencies>

以下是如何聲明Application模組的依賴項:

<dependencies>    <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Common</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>    <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Utilities</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>  </dependencies>

最後是WebApplication模組的依賴項:

<dependencies>    <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Common</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>    <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Utilities</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>        <dependency>      <groupId>com.oreilly</groupId>      <artifactId>Application</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>     </dependencies>

現在,我們只需為每個子模組的pom.xml檔案添加一個元素來表明它們是一個邏輯構建的一部分:

<parent>    <groupId>com.oreilly</groupId>    <artifactId>my-app</artifactId>    <version>1.0-SNAPSHOT</version>  </parent>

在pom.xml父檔案所在的同一個目錄中,存在有項目目錄:Common, Utilities, Application, 和WebApplication。當我們在該目錄中運行mvn package命令時,這些項目會按照依賴順序而被構建。

外掛程式和報表

Maven2.0
有大量的外掛程式可以使用。不幸的是,由於Maven的重寫,Maven1.0的外掛程式不能在2.0中使用。儘管如此,還是存在一些可以使用的Maven2.0
的外掛程式。下面pom.xml檔案中的外掛程式配置樣本是直接從Maven2.0網站上得來的。這個外掛程式是用來配置編譯選項的。

<plugins>    <plugin>      <groupId>org.apache.maven.plugins</groupId>      <artifactId>maven-compiler-plugin</artifactId>      <configuration>        <source>1.5</source>        <target>1.5</target>      </configuration>    </plugin>  </plugins>

Maven報表外掛程式可以用來產生不同的報表,這些報表是在當你使用mvn site命令產生項目的網站時產生的。下面的例子展示了如何使用<reporting>元素來配置這類外掛程式中的一個。

<reporting>    <plugins>      <plugin>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>maven-project-info-reports-plugin</artifactId>      </plugin>    </plugins>  </reporting>

Maven Plugin Matrix是一個十分實用的工具,它能給出哪些Maven外掛程式適合於哪些版本的Maven。

Maven 和 Eclipse


何能使全世界最好的IDE變得更好了?答案是使用Maven2的外掛程式,它能協助您尋找依賴項並自動地將它們添加到pom.xml檔案中。雖然最好的方法是
首先使用Maven來建立您的項目,然後再用命令mvn eclipse:eclipse來產生Eclipse專案檔,這樣最初就能得到一個好的目錄結
構,但Maven也可通過其Eclipse外掛程式來管理任何項目。

您可以在Eclipse自身的升級器中輸入網站

http://m2eclipse.codehaus.org/來安裝外掛程式。在安裝完成並重啟IDE後,您需要在Eclipse的參數選項中配置此外掛程式,

設定本機存放區庫的位置。這是很重要的一步,因為如果Eclipse預設的存放庫不能匹配您預設的需求,Maven會重新下載您的依賴項。配置完成後,將項
目匯入Eclipse,滑鼠右擊該項目,選擇Maven 2 -> Enable。現在您可以回到之前的步驟,您可以有更多的選項比如添加依賴項,
這將彈出一個搜尋方塊,您可以搜尋依賴項並添加它們,外掛程式會替你編輯pom.xml檔案。

外掛程式會使用Maven來構建您的項目,就像Eclipse使用Ant來構建項目一樣。如果您想擷取更多的關於Eclipse整合Maven的資訊,可以查閱Maven網站上的Eclipse整合Maven 2.x使用指南。


一方面,如果您是一個IntelliJ使用愛好者,您也能通過運行指令mvn idea:idea來完成同樣的任務。這些IDE        工具能夠
節省開發人員的時間。例如,如果一個開發人員為一個項目添加了一些特徵,團隊裡的其他開發人員只需從原始碼控制器的存放庫中重新擷取專案檔即可,這就節
省了每個開發人員必須配置IDE的時間。

結論

Maven2.0有著許多實用的特點,並且完成任務十分出色。Maven中
最值得稱讚的地方就是使用了標準的目錄結構和部署。這就使得開發人員能夠適應不同的項目,並且不用學習任何結構方面新的東西,也不用掌握特殊的指令來構建
結構。Maven可以通過純指令碼來實現。在文檔方面,由於使用了項目網站構建工具,所以當項目構建完成後,您可以查看所有開發的目前狀態。


無疑問,當提到構建配置的伸縮性,易用性和專案管理方面時,Maven2.0足可以將Ant取而代之。在接下來的幾年內,我們將看到Maven作為標準構
建技術更多的使用,直到有人帶來了大家公認的“進階捕鼠器”。您可以從下面列出的Maven項目網站上下載Maven。

資源
Matrix:http://www.matrix.org.cn
Onjava:http://www.onjava.com
Maven項目網站

Chris Hardin 是McLeod軟體公司的進階Java工程師。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.