Maven 2.0: Compile, Test, Run, Deploy, and More(1)

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服務器 上也同樣是個便利之舉,這樣整個開發團隊就能從此獲益,每個人都沒有必要去管理自己的存儲庫了。改變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>

您或許想將依賴項存入一個源代碼控制器的庫中,源代碼控制器決不能執行這個任務。依賴項是經常變化的,並且通常有一套數字方案來標明其版本。這就是說,您 明 確地希望有一個內部遠程存儲庫的備份,如果您有一個,這將確保在存儲庫服務器崩潰並且不能恢復的情況下,您不會丟失所有的自定義資源。不將依賴項放入源代 碼控制器中也會節省源代碼控制器的存儲庫服務器上的大量磁盤空間。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章