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誕生了。
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的依賴以此來鼓勵單元 測試。
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
4.0.0
com.oreilly
my-app
jar
1.0-SNAPSHOT
Maven Quick Start Archetype
http://maven.apache.org
junit
junit
3.8.1
test
創建完項目後,我們可以往項目裏添加代碼並使用Maven的所有全新技巧。注意以下命令必須在pom.xml文件所在的目錄中運行。
–mvn test:運行應用程序中的單元測試
–mvn package:依據項目生成jar文件
以備依賴此項目時使用l–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文件:
war。現在就可以使用mvn package命令來生成war文件。不用擔心如何從WEB-INF/lib目錄中得到依賴項,在依賴屬性值被設置成compile的情況下,Maven 會自動包含依賴項。也可以將以下代碼添加到pom.xml文件中來改變war文件的名稱:
PromoteC
依賴管理
創建好項目結構,添加完一些代碼,測試並編譯好應用程序後,接下來可以看看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編寫的關於時間安排的開源項目,它是您時間安排需求方面的很好的選擇。
quartz
quartz
1.5.1
compile
我們僅僅只需添加這個元素,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的使用條款。
javax.activation
activation
1.0
compile
您或許想將依賴項存入一個源代碼控制器的庫中,源代碼控制器決不能執行這個任務。依賴項是經常變化的,並且通常有一套數字方案來標明其版本。這就是說,您明確地希望有一個內部遠程存儲庫的備份,如果您有一個,這將確保在存儲庫服務器崩潰並且不能恢復的情況下,您不會丟失所有的自定義資源。不將依賴項 放入源代碼控制器中也會節省源代碼控制器的存儲庫服務器上的大量磁盤空間。
配置存儲庫
要求項目的每個開發者必須在conf目錄中配置存儲庫是不方便的,所以Maven可以同時查看多個存儲庫並且將它們全部配置在pom.xml文件 中。讓我們看看一個例子,它展示瞭如何在應用程序用使用多個存儲庫。在以下從pom.xml文件摘錄的片斷中,我們設置了兩個存儲庫來讓Maven尋找依 賴項。Ibiblio一直是默認的存儲庫,我們又添加了Planet Mirror作爲後援存儲庫。我們也可以讓團隊使用的本地web服務器作爲第二個存儲庫。
Ibiblio
Ibiblio
http://www.ibiblio.org/maven/
PlanetMirror
Planet Mirror
http://public.planetmirror.com/pub/maven/
使用pom.xml父文件來構建多個項目
軟件公司通常的一種做法就是將多個項目構建到主要產品中。維護依賴關係鏈和一次性地構建整個產品足以成爲一個挑戰,但是如果使用Maven的話,事 情將變得簡單。如果您創建了一個指向其它子模塊的pom.xml父文件,Maven將爲您處理整個構建過程。它將分析每個子模塊的pom.xml文件,並且按照這些子模塊的相互依賴順序來構建項目。如果每個項目明確地指明它們的依賴項,那麼子模塊在父文件中的放置順序是不造成任何影響的。但是考慮到其他的 開發者,最好保證子模塊在pom.xml父文件中的放置順序和您期望的子項目被構建的順序一樣。下面我們看個示例。
pom.xml主文件如下:
4.0.0
com.oreilly
1.0-SNAPSHOT
my-app
pom
Common
Utilities
Application
WebApplication
我們需要確保WebApplication子模塊包含了所有的三個jar包,所以需要將這些jar包聲明爲依賴項。在這個例子中, Utilities項目依賴於Common項目,所以Utilities項目中需要添加一個對Common項目的依賴。Application子模塊也是 同樣的道理,因爲它依賴於Common和Utilities項目,Utilities又賴於Common。如果這個例子中有60個子模塊,並且它們都相互 依賴,這會使得新開發者難以算出什麼項目依賴於其它項目,所以這正好是要求確保pom.xml父文件中項目放置順序要清除的原因。
以下是Utility模塊的依賴項:
com.oreilly
Common
1.0-SNAPSHOT
以下是如何聲明Application模塊的依賴項:
com.oreilly
Common
1.0-SNAPSHOT
com.oreilly
Utilities
1.0-SNAPSHOT
最後是WebApplication模塊的依賴項:
com.oreilly
Common
1.0-SNAPSHOT
com.oreilly
Utilities
1.0-SNAPSHOT
com.oreilly
Application
1.0-SNAPSHOT
現在,我們只需爲每個子模塊的pom.xml文件添加一個元素來表明它們是一個邏輯構建的一部分:
com.oreilly
my-app
1.0-SNAPSHOT
在pom.xml父文件所在的同一個目錄中,存在有項目目錄:Common, Utilities, Application, 和WebApplication。當我們在該目錄中運行mvn package命令時,這些項目會按照依賴順序而被構建。
插件和報表
Maven2.0有大量的插件可以使用。不幸的是,由於Maven的重寫,Maven1.0的插件不能在2.0中使用。儘管如此,還是存在一些可以 使用的Maven2.0的插件。下面pom.xml文件中的插件配置示例是直接從Maven2.0網站上得來的。這個插件是用來配置編譯選項的。
org.apache.maven.plugins
maven-compiler-plugin
1.5
1.5
Maven報表插件可以用來生成不同的報表,這些報表是在當你使用mvn site命令生成項目的站點時產生的。下面的例子展示瞭如何使用元素來配置這類插件中的一個。
org.apache.maven.plugins
maven-project-info-reports-plugin
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項目站點
相關文檔_
maven2.0學習筆記
Maven最初的目的是在Jakarta Turbine項目中使構建處理簡單化。幾個項目之間使用到的Ant build文件差異很小,各個JAR都存入CVS。因此希望有一個標準的方法構建各個工程,清晰的定義一個工程的組成,一個容易的方法去發佈項目信息並且去提供一種在各個項目之間共享JAR包。
結果出現了一種功能能用於構建和管理任何基於java的工程。Maven小組希望他們已經做到了一些事情,這將有助於Java開發者更容易的完成每天的工作並且有助於理解任何基於java的項目。
Maven的目標是:
· 使構建過程更容易
· 提供統一構建系統
· 提供高質量的項目信息
· 提供開發的最佳實踐指南
· 能無縫的加入新的特性
對Maven的錯誤理解
· Maven是一個站點和文檔製作工具。
· Maven擴展了Ant,使其能下載到各種依賴包
· Maven是一系列可重用的Ant腳本
Maven的版本。
Maven現在主要有Maven 1.x和Maven 2.x,其中現在最新版本是Maven 2.02。
Maven 2完成了對Maven 1的重寫。重寫的首要目的是要提供了強大的Jave構建和包含API的項目,允許Maven被植入任何地方,尤其是高級別的產品如IDEs、質量工具、報告工具等這些。Maven 2構建生命週期的概念正式化,其比Maven更易擴展。
因此現在我們主要研究的就是Maven 2。
Maven的安裝
1. Windows 2000/xp下的安裝
1. 解壓縮maven-2.0.2-bin.zip到你希望安裝Maven 2.0.2的所在目錄。這裏假設你選擇了C:\ProgramFiles\Apache Software Foundation\maven-2.0.2.
2. 將C:\Program Files\Apache Software Foundation\maven-2.0.2\bin目錄加入到你的%path%環境變量中。
3. 同時,確認JAVA_HOME是否正確設置成功。
4. 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
2. 基於Unxi-based的操作系統(Linux,Solaris and Mac OS X)
1. 解壓縮發佈包到你希望安裝Maven 2.0.2的所在目錄。這裏假設你選擇了/usr/local/maven-
2. 將/usr/local/maven-2.0.2/bin目錄加入到你的path環境變量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。
3. 同時,確認JAVA_HOME是否正確設置成功。
4. 運行 mvn --version 確認是否安裝成功。
顯示Maven version: 2.0.2 則表示安裝成功。
Maven主要功能列表
Maven是一種對項目的管理工具,它提供了一種方式來管理以下項目中涉及到的工作內容,同時以下也是Maven的主要功能:
· 構建項目(Builds)
· 文檔編制(Documentation)
· 報告(Reporting)
· 依賴管理(Dependencies)
· 配置管理(SCMs)
· 發佈管理(Releases)
構建項目
1. 首先創建一個Maven工程
Maven可用於構建java應用工程和java web應用工程。
1. WebApp
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
my-webapp
|-- pom.xml
`-- src
`-- main
|-- webapp
| |-- WEB-INF
| | `-- web.xml
| `--index.jsp
`-- resources
其他的目錄則需要自己補充。
其pom.xml文件內容如下:
<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.mycompany.app</groupId> <artifactId>my-webapp</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Webapp 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> <build> <finalName>my-webapp</finalName> </build> </project>
|
2. App
mvn archetype:create -DgroupId=com.mycompany.ap -DartifactId=my-app
命令正確執行後,生成如下目錄:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
其pom.xml文件內容如下:
<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.mycompany.ap</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> |
2. Maven項目的標準目錄介紹
Maven提倡使用一個共同的標準目錄結構,使開發人員能在熟悉了一個Maven工程後,對其他的Maven工程也能清晰瞭解。這樣做也省去了很多設置的麻煩。
以下的文檔介紹是Maven希望的目錄結構,並且也是目錄創建工程是採用的目錄結構。Maven推薦大家儘可能的遵守這樣的目錄結構。
src/main/java |
Application/Library sources |
src/main/resources |
Application/Library resources |
src/main/filters |
Resource filter files |
src/main/assembly |
Assembly descriptors |
src/main/config |
Configuration files |
src/main/webapps |
Web application sources |
src/test/java |
Test sources |
src/test/resources |
Test resources |
src/test/filters |
Test resource filter files |
src/site |
Site |
LICENSE.txt |
Project's license |
README.txt |
Project's readme |
在頂級目錄上是工程的描述文件pom.xml(如果使用Ant則還包括其他屬性文件,maven.xml或build.xml),另外還包括提供給最終用戶的文件,如,README.txt, LICENSE.txt等等。
頂級目錄還包括兩個子目錄:src,target。頂級目錄下可能出現的其他目錄僅僅是CVS或.svn和其他多模塊工程的工程目錄,最好不要再有其他目錄。
Target目錄是所有工程編譯構建的輸出目錄。
Src目錄包含所有工程的源碼文件,配置文件,資源文件等等。它下面的子目錄一般包含main(主要的工程源文件),test(測試文件),site(項目站點文件)。
3. 項目構建的生命週期的介紹
Maven 2是圍繞着構建生命週期概念設計的。這意味着,構建或者發佈的過程已經被清晰的定義了。
當我們使用Maven構建工程時,我們只需要瞭解幾個Maven定義好的命令即可,其他的工作則交給POM來完成。
以下給出Maven提供的構建生命週期列表:
validate |
validate the project is correct and all necessary information is available. |
generate-sources |
generate any source code for inclusion in compilation. |
process-sources |
process the source code, for example to filter any values. |
generate-resources |
generate resources for inclusion in the package. |
process-resources |
copy and process the resources into the destination directory, ready for packaging. |
compile |
compile the source code of the project. |
process-classes |
post-process the generated files from compilation, for example to do bytecode enhancement on Java classes. |
generate-test-sources |
generate any test source code for inclusion in compilation. |
process-test-sources |
process the test source code, for example to filter any values. |
generate-test-resources |
create resources for testing. |
process-test-resources |
copy and process the resources into the test destination directory. |
test-compile |
compile the test source code into the test destination directory |
test |
run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed. |
package |
take the compiled code and package it in its distributable format, such as a JAR. |
pre-integration-test |
perform actions required before integration tests are executed. This may involve things such as setting up the required environment. |
integration-test |
process and deploy the package if necessary into an environment where integration tests can be run. |
post-integration-test |
perform actions required after integration tests have been executed. This may including cleaning up the environment. |
verify |
run any checks to verify the package is valid and meets quality criteria. |
install |
install the package into the local repository, for use as a dependency in other projects locally. |
deploy |
done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. |
因此,當我們構建一個項目時,只需要瞭解自己希望做什麼,然後執行以上對應的生命週期即可。
例如,我們希望編譯我們的工程。在命令行狀態下進入到工程的pom.xml文件所在的目錄中,使用命令:mvn compile;希望構建打包我們的工程,使用mvn package即可。
當然了,maven的構建生命週期也是可以擴展和自定義的,這裏就先不做介紹了。
4. pom.xml的介紹
pom.xml包含了一個項目的項目對象模型(POM)。項目對象模型(POM)是Maven工作的基本單元。請記住,這個是非常重要的,因爲POM包含了工程的非常重要的信息塊,並且基本上包含了和項目相關的任何要素。
讓我們熟悉一下pom.xml包含的基本項:
· poject 這是pom.xml的頂級元素。
· modelVersion 這是元素指出了這個POM使用的是那個版本的對象模型。這個模型的版本自身麼是經常改變的,但這種改變是爲了使模型更加的穩定。
· groupId 這個元素指出創建這個工程的組織或團隊的唯一標識,並且這個也是一個項目的關鍵標識,推薦使用這個組織或團隊的完整域名。例如:org.apache.maven.plugins是爲Maven plug-ins定義的groupId。
· artifactId 這個元素指出這個工程的主要製品的基本名稱。一個工程的主要製品如果是jar文件,次要製品如果是源碼包,則次要製品的名稱的一部分也使用artifactId。典型的製品名稱使用這樣的格式:<artifactId>-<version>.<extension>(例如,myapp-1.0.jar)。
· packaging 這個元素指出製品的類型(例如:JAR,WAR,EAR等等)。這個元素不僅僅指示出製品的類型,同時也指示出工程構建過程中的部分生命週期。Packaging的默認值是JAR。
· version 這個元素指出這個項目產生的製品的版本號,Maven在幫助開發人員管理版本號時走了很長的路,以後你將經常看到SNAPSHOT在一個版本中,這個表示一個工程仍然在開發狀態。
· name 這個元素指出這個工程顯示的名稱。這個常用於Maven產生的文檔中。
· url 這個員算指出在哪裏能發現工程的站點。這個常用於Maven產生的文檔中。
· desription 這個元素提供了這個工程基本的描述。這個也常用於Maven產生的文檔中。
以上只是pom.xml中的一些基本項,完整的pom.xml的元素介紹請參考:
http://maven.apache.org/maven-model/maven.html
文檔編制
1. 文檔創建:
對於如何創建和編制文檔,maven有一個簡單的示例命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site |
執行了以上命令後,我們將得到這樣一個目錄結構:
my-app |-- pom.xml `-- src |-- site |-- apt | |-- format.apt | `-- index.apt |-- fml | `-- faq.fml |-- fr | |-- apt | | |-- format.apt | | `-- index.apt | |-- fml | | `-- faq.fml | `-- xdoc | `-- xdoc.xml |-- site.xml |-- site_fr.xml `-- xdoc `-- xdoc.xml |
你現在可以看到一個$basedir/src/site目錄,以及它包含的一些站點描述文件(site.xml,site_fr_xml),和各種maven支持的文檔格式相對應的目錄和示例文檔都已經產生。
以上的創建只是示例,我們自己創建時就沒有命令行使用了,只能按照上面的目錄結構創建我們需要的文檔,並在文檔中寫入我們工程的信息。
讓我們再來看看maven所支持的文檔格式。
2. 文檔格式:
Maven支持3種文檔格式:
· Xdoc format
這個是一種簡單快捷的,基於original Anakia format的文件格式。
· APT format
“Almost Plain Text”,(接近普通文本格式),這是一種允許你採用接近普通文本格式的方式簡單的寫出類似於wiki格式的結構性文檔。
如果你對此很感興趣,請參考完整的APT format的書寫規範
http://maven.apache.org/guides/mini/guide-apt-format.html
· FML formate
這個是一種FAQ結構形式的文檔格式。
瞭解了以上的文檔格式,我們就可以按照以上文檔格式的要求,選用我們喜歡的文檔格式編寫我們的文檔。當編寫完成後,我們需要生成所有文檔。這裏生成文檔,maven的處理是生成站點(site),也就是身成html頁面,這樣所有對此項目感興趣的人員都可以通過訪問此站點來了解所有的信息。生成站點的命令是:
mvn site |
3. 文檔國際化:
當然,你可能早就想到文檔國際化的問題,這裏maven也早就處理了。在pom.xml中
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <configuration> <locales>en,fr</locales> </configuration> </plugin> </plugins> ... |
注意到<locales>en,fr</locales>了嗎?這裏就支持了英語(en)和法語(fr)兩種語言的文檔。請注意以下生成的目錄,由於英語是在第一個,屬於默認語言,所以$basedir/src/site目錄下並沒有en的文件夾,而有fr的文件夾,而且這個文件夾裏包含了maven支持的文檔格式相對應的目錄和示例文檔。
報告設置
Maven有多個報告能添加在你的文檔站點中,來顯示項目當前的狀態,這些報告採用插件的形式可在項目中配置。
爲了爲你的文檔站點增加這些報告,必須增加reporting部分在pom.xml中,下面這個爲標準的項目信息報告插件在pom.xml中的配置。
<project> ... <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </plugin> </plugins> </reporting> ... |
Maven在執行mvn site命令時,除了產生開發人員編制的文檔信息外,根據pom.xml中設置的報告,會同時生成這個項目信息的報告文檔。並且這個是默認的生成項。
這個默認的生成項將根據項目的信息生成以下報告:
· 持續集成信息(Continuous Integration)
· 依賴性信息(Dependencies)
· 發佈追蹤信息(Issue Tracking)
· 郵件列表信息(Mailing Lists)
· 工程協議信息(Project License)
· 項目團隊信息(Project Team)
· 源碼庫信息(Source Repository)
根據筆者測試,以上信息均是在pom.xml進行設置的。
· 持續集成信息根據以下配置信息生成:
<ciManagement> <system/> <url/> <notifiers> <notifier> <type/> <sendOnError/> <sendOnFailure/> <sendOnSuccess/> <sendOnWarning/> <address/> <configuration/> </notifier> </notifiers> </ciManagement> |
· 依賴性信息根據以下配置信息有關
<dependencies> <dependency> <groupId/> <artifactId/> <version/> <type/> <classifier/> <scope/> <systemPath/> <exclusions> <exclusion> <artifactId/> <groupId/> </exclusion> </exclusions> <optional/> </dependency> </dependencies> |
· 發佈追蹤信息
<issueManagement> <system/> <url/> </issueManagement> |
· 郵件列表信息
<mailingLists> <mailingList> <name/> <subscribe/> <unsubscribe/> <post/> <archive/> <otherArchives/> </mailingList> </mailingLists> |
筆者在pom.xml中設置以上信息後,運行mvn site總會報錯。如果哪位瞭解到報錯原因請告訴我,謝謝。[email protected]
· 工程協議信息
<licenses> <license> <name/> <url/> <distribution/> <comments/> </license> </licenses> |
· 項目團隊信息
<organization> <name/> <url/> </organization> |
<developers> <developer> <id/> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </developer> </developers>
|
<contributors> <contributor> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </contributor> </contributors> |
· 源碼庫信息
<scm> <connection/> <developerConnection/> <tag/> <url/> </scm> |
默認情況下這些文檔將生成在$basedir/src/site目錄下。
需要得到其他的報告,則需要配置其他的報告插件。
要想了解更多的信息,請參考以下網頁:
http://cvs.peopleware.be/training/maven/maven2/morePlugins.html
依賴管理
這裏我們通過使用外部依賴(external dependencies)來大家對maven的依賴管理有一個簡單而具體的瞭解。
當我們在做一個工程的時候,不可能一切都是從空白開始,對於我們做Web應用的來說,使用框架已經司空見慣,而這種對框架的引入使用對於Maven來說,就是工程的依賴。而我們的工程要進行測試,則不能少了對Junit框架的依賴。
依賴管理是maven的一個主要特徵,這個是對於用戶來說,是Maven令人振奮的一個最著名的特徵。對於一個單一的工程來說,依賴管理沒有什麼困難的,但是當你開始處理多個模塊的工程或由10多個甚至上百個模塊組成的應用程序時, Maven能幫助你輕鬆穩定的控制這些大量的依賴。
在pom.xml中dependencies部分列出了所有外部依賴,詳細描述了在編譯時,測試時,運行時是否需要這個依賴。現在,假定我們的工程只有對Junit的依賴。它的pom.xml文件可能如下:
<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.mycompany.app</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> |
從以上pom.xml文件可以看出,定義一個外部依賴(external dependencies)至少需要4個元素:groupId, artifactId, version, and scope。對於groupId, artifactId, version的意思,和前面我們在創建工程時提到的這幾個元素的意義相同,這裏就不再重複介紹,scope元素指出你的工程如何使用依賴,並且它的值有compile,test和runtime等等。想要了解更多的依賴說明的信息,請看
http://maven.apache.org/maven-model/maven.html
要想了解完整的依賴機制,請看
http://maven.apache.org/guides/introduction/introduction-to-dependency-management.html
有了這些依賴信息,Maven將能在工程構建時引用依賴。
引用的過程是:
首先,在本地倉庫(默認的本地倉庫地址爲:~/.m2/repository)中查找此依賴是否存在。
再次,如果在本地倉庫中未發現,則在遠程倉庫中下載此依賴,並下載到本地倉庫中。
最後,通過以上兩個步驟就能找到依賴。如果遠程倉庫無法訪問,則可以設置其他遠程倉庫。具體請看
http://maven.apache.org/guides/introduction/introduction-to-repositories.html
一個簡單的例子。比如我們要添加一個log4j到我們的工程中。
首先.需要了解log4j的groupId, artifactId, and version信息。可在google上搜索“site:www.ibiblio.org maven2 log4j”。這樣在搜索結果裏可以找到/maven2/log4j/log4j (or /pub/packages/maven2/log4j/log4j)這樣的目錄,在這個目錄中有一個文件叫做maven-metadata.xml。這個文件內容如下所示:
<metadata> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.1.3</version> <versioning> <versions> <version>1.1.3</version> <version>1.2.4</version> <version>1.2.5</version> <version>1.2.6</version> <version>1.2.7</version> <version>1.2.8</version> <version>1.2.11</version> <version>1.2.9</version> <version>1.2.12</version> </versions> </versioning> </metadata> |
這樣我們能找到groupId爲log4j,artifactId爲log4j,version當然要用最新的,選擇1.2.12。scope我們設置爲compile。
這樣我們使用mvn compile 編譯工程時,會看到mvn下載了log4j到我們的本地倉庫。
配置管理
Maven的配置管理是作爲一個單獨的Maven子項目在做。叫做SCM。他是這樣介紹的:
MavenSCM支持Maven 2.x插件(例如,maven-release-plugin)和其他工具(例如,Continuum,這個是一個和maven 2.x結合很好的一個持續集成工具。),Maven SCM提供給他們一個公共的API去做配置管理的各種操作。當然了要執行配置管理操作,當然少不了配置滾裏工具了。Maven SCM給出了一個列表,說明Maven SCM現在所支持的配置管理工具。
完全支持的配置管理工具 |
CVS Subversion Perforce StarTeam |
部分支持的配置管理工具 |
ClearCase File system Visual Source Safe |
不支持的配置管理工具 |
Accurev Aegis Arch BitKeeper ClearCase Multisite CM Synergy Code Co-op Darcs Monotone OpenCM PureCM Serena PVCS / Dimension Starteam Enterprise Svk Vesta |
當你選中了上面的一個配置管理工具,你就可以利用Maven 2.x的插件或者集成管理工具進行配置管理了。
1. 持續集成工具continuum
continuum是Maven的一個子項目。他是一個構建基於java的工程的持續集成服務器。他支持以下多種工程類型:
· Maven 1
· Maven 2
· Ant
· Shell scripts
continuum有以下特徵
· 緊密整合Maven 2.x
· 緊密整合Maven SCM
o Subversion
o CVS
o Starteam
o Clearcase
o Perforce
· 更易用的基於網絡的設置和界面
· 基於Quartz(Quartz-based)的時間計劃表設置
· 添加新項目十分方便
· 郵件通知
· 其他IM通知
o IRC
o Jabber
o MSN
· 責備機制(Blame Mechanism)
1. 下載:
在以下連接處下載此軟件
http://maven.apache.org/continuum/download.html |
安裝:
Windows 2000/XP
解壓縮continuum-1.0.2-bin.zip到你希望安裝Continuum 1.0.2的所在目錄。這裏假定你安裝在C:\Program Files\Apache Software Foundation\continuum-1.0下。
運行:
· bin/linux/run.sh 如果是UNIX平臺
· bin/solaris/run.sh 如果是Solaris平臺
· bin/win32/run.bat 如果是Windows平臺
· bin/macosx/run.sh 如果是MacOS X平臺.
· bin/plexus.sh 如果是其他平臺
當服務器啓動成功後,打開瀏覽器訪問:
http://localhost:8080/continuum/ |
注意:由於continuum判斷一個工程是否構建成功,是使用一個命令行返回值。而windows平臺的用戶,這個返回值有問題。因此需要修改以下maven 2的bin/mvn.bat文件。這裏可以直接從以下地址下載修改後的文件替換掉即可。
http://maven.apache.org/continuum/scripts/mvn.bat |
2. 添加一個項目到continuum
要添加一個maven 2的項目到continuum,需要寫入一個pom url或者導入一個pom.xml,當然導入的這個pom.xml文件中包含了continuum需要的各種信息。
我們來看看導入的pom.xml文件中具體需要包含哪些項:
· 配置管理信息(The SCM information)
<scm> <connection/> <developerConnection/> <tag/> <url/> </scm> |
· 開發者信息(The developers)
<ciManagement> <system>continuum</system> <notifiers> <notifier> ... </notifier> </notifiers> </ciManagement> |
· 集成後所有的通知人信息(The notifiers)
<notifier> <type>mail</type> <configuration> <address>[email protected]</address> </configuration> <notifier> |
<notifier> <type>irc</type> <configuration> <host>irc.codehaus.org</host> <port>6667</port> <channel>#maven</channel> </configuration> </notifier> |
3. 構建工程
· 按照定製的時間構建
· 點擊本項目上的build按鈕進行構建。
發佈管理Releases
1. 發佈配置方法
要發佈(Releases)一個項目,需要在pom.xml和setting.xml中分別配置。
在pom.xml中
<distributionManagement> <repository> <id>mycompany-repository</id> <name>MyCompany Repository</name> <url>scp://repository.mycompany.com/repository/maven2</url> </repository> </distributionManagement> |
在setting.xml中
<settings> . . <servers> <server> <id>mycompany-repository</id> <username>jvanzyl</username> <!-- Default value is ~/.ssh/id_dsa --> <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa) <passphrase>my_key_passphrase</passphrase> </server> </servers> . . </settings> |
通過以上的設置,項目將可以發佈到遠程倉庫,遠程服務器。
項目發佈現在支持scp,ftp和scpexe等方式。
2. Setting.xml文件
這個文件是一個maven的配置文件。
他有下面的功能:
· 配置本地倉庫
· 配置訪問網絡的代理服務器
· 安全和部署的設置。
· 爲倉庫設置景象
想要了解更多這個文件的信息可以參考一下以下文章:
http://maven.apache.org/guides/mini/guide-configuring-maven.html |
3. 運行發佈的命令
mvn deploy |
Maven和eclipse工具的合作
當有了以上的工程目錄,無論是webapp工程,還是app,我們都希望在集成開發環境中開發。Maven如何和IDE集成。現在我們就來進行講解。
1. 首先要讓eclipse知道Maven 2的repository(倉庫)的路徑。
因此要設置一個M2_REPO的變量爲classpath。
可以使用命令行的方式來設置:
mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo |
還可以在eclipse中定義一個新的classpath變量通過在eclipse的菜單上選擇Window> Preferences. 選擇Java > Build Path > Classpath Variables page.
2. 生成eclipse的工程文件。
使用命令行
mvn eclipse:eclipse |
這樣通過在eclipse的菜單上選擇File >Import >Existing Projects into Workspace,就可以將工程導入eclipse中。
通過以上2個步驟,我們就可以利用eclipse來進行開發工作了。
3. Eclipse插件mavenide
同時在eclipse中我們可以下載一個maven的插件,用來輔助eclipse進行maven工程的開發工作。這個插件名稱叫做mavenide。
這個插件可使用以下更新站點:http://m2eclipse.codehaus.org/
並且非常方便的是,這裏還提供了一個flash的演示來介紹如何安裝此插件,這個flash演示的觀看地址在:
http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html
要正常使用此插件請注意以下問題:
eclipse使用3.1或以上版本。
Mavenide的插件爲0.0.5不要安裝錯誤了。
通過筆者在安裝好此插件的一些使用後,看到了此插件的以下一些特性。
1. 可以方便的添加依賴。
2. 在編輯完pom.xml文檔後,會自動檢查此文檔的格式是否正確。
3. 可以將mvn的一些命令通過擴展工具的方式在eclipse中輕鬆執行。