1、關於Maven
最近學了一些maven方面的知識,感覺這個工具挺好用,爲防遺忘現總結一下。Maven是一個項目管理工具,它可以通過一段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。當你使用Maven的時候,你用一個明確定義的項目對象模型來描述你的項目,然後Maven可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)插件。項目的主頁地址爲:http://maven.apache.org/
2、配置文件
Maven2 主要配置文件有pom.xml和settings.xml。
2.1 pom.xml
我們知道,Maven項目,依賴,構建配置,以及構件,所有這些都是要建模和表述的對象,這些對象就是通過pom.xml 文件描述的。這個POM 告訴Maven它正處理什麼類型的項目,如何修改默認的行爲來從源碼生成輸出等等。該文件就是Maven中一個項目的描述性陳述;也是當Maven構建項目的時候需要理解的一份“地圖”。
它包含的基本項如下:
- 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
2.2 settings.xml
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級別:
- 用戶級,針對操作系統登錄用戶而言。一般在$home/.m2/,對於windows用戶,就是目錄:C:\Documents and Settings\用戶名\.m2\settings.xml。
- 全局級:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目錄環境變量名。
在settings.xml中可以配置,如本地Repository、proxy等等.
3、目錄結構
Maven2的標準目錄結構如下:
使用目錄模板,可以使pom.xml更簡潔。因爲Maven2已經根據缺省目錄,預定義了相關的動作,而無需人工的干預。以resources目錄爲例:
- src/main/resources,負責管理項目主體的資源。在使用Maven2執行compile之後,這個目錄中的所有文件及子目錄,會複製到target/classes目錄中,爲以後的打包提供了方便。
- src/test/resources,負責管理項目測試的資源。在使用Maven2執行test-compile之後,這個目錄中的所有文件及子目錄,會複製到target/test-classes目錄中,爲後續的測試做好了準備。
4、安裝maven2
安裝Maven2的步驟非常簡單:首先從Maven官方網站http://maven.apache.org/下載相應的軟件包,目前是Maven 2.0.4;然後解壓,並設置環境變量M2_HOME= Maven2的解壓安裝目錄;最後將%M2_HOME%/bin添加到path中,方便Maven在任何目錄下運行。檢查一下是否已經完成安裝,打開dos窗口,輸入mvn –v,如果出現一下信息則表示maven2已經安裝成功:
X:>mvn –v
Maven Version2.0.4
5、常用運行命令
Maven2的運行命令是mvn,使用mvn -h可以獲得相關的幫助信息。常用情形:
- 創建Maven項目:mvn archetype:create
- 編譯源代碼:mvn compile
- 編譯測試代碼:mvn test-compile
- 運行測試:mvn test
- 產生site:mvn site
- 打包:mvn package
- 在本地Repository中安裝jar:mvn install
- 清除產生的項目:mvn clean
6、項目開發
6.1創建項目的步驟
生成項目佈局:mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app
創建完項目後,我們可以往項目裏添加代碼並使用Maven的所有全新技巧。注意以下命令必須在pom.xml文件所在的目錄中運行。
–mvn test:運行應用程序中的單元測試
–mvn package:依據項目生成jar文件,以備依賴此項目時使用
–mvn install:將項目的jar文件添加到庫中,
–mvn site:生成項目相關信息的網站
–mvn clean:清除目標目錄中的生成結果
–mvn eclipse:eclipse:生成Eclipse項目文件
6.2 生命週期的引入
在Maven2中有了明確的生命週期概念,而且都提供與之對應的命令,使得項目構建更加清晰明瞭。主要的生命週期階段:
- validate,驗證工程是否正確,所有需要的資源是否可用。
- compile,編譯項目的源代碼。
- test-compile,編譯項目測試代碼。
- test,使用已編譯的測試代碼,測試已編譯的源代碼。
- package,已發佈的格式,如jar,將已編譯的源代碼打包。
- integration-test,在集成測試可以運行的環境中處理和發佈包。
- verify,運行任何檢查,驗證包是否有效且達到質量標準。
- install,把包安裝在本地的repository中,可以被其他工程作爲依賴來使用
- deploy,在整合或者發佈環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
- generate-sources,產生應用需要的任何額外的源代碼,如xdoclet。
如果要執行項目編譯,那麼直接輸入:mvn compile即可,對於其他的階段可以類推。階段之間是存在依賴關係(dependency)的,如test依賴test-compile。在執行mvn test時,會先運行mvn test-compile,然後纔是mvn test。
7、依賴管理
爲了給項目添加一個依賴項,必須將此依賴項添加到pom.xml文件中。下次運行Maven的時候,它將從Ibiblio存儲庫中得到這個依賴項,並且將此依賴項添加到項目構建路徑中。Maven中最大的麻煩之處就是不能從Maven存儲庫中獲取Sun的jar文件。這個問題歸因於Sun在其代碼中設置的許可證限制。解決這個問題的辦法有兩種,一種是下載這些代碼並將它們安裝在您本地的存儲庫中,另一種是做一個外部聲明,並將這個聲明指向文件系統中依賴項所在的位置。改變Maven的存儲庫路徑只需簡單地編輯其安裝目錄下 conf文件夾下面的settings.xml文件即可
在Maven中使用依賴是簡單的。讓我們看看往上述pom.xml文件中添加一個依賴項的情況。
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.1</version>
<scope>compile</scope>
</dependency>
注意到scope參數的使用,它告訴了Maven依賴項在何種階段是所需的。在使用JUnit的情況下,我們設置scope參數的值爲test來告訴Maven這個依賴項只是在測試階段所需的,而不是運行時所需的資源。以下是scope參數值的說明:
–compile:默認值。表明是所有任務所需的資源
–test:運行所有的測試用例時所需資源
–runtime:表明是運行時所需資源
–provided:JDK部分或應用服務器的classpath所需的資源
8、手動安裝jar包到本地存儲庫
如何處理那些麻煩的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
9、配置存儲庫
要求項目的每個開發者必須在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>
10、使用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>
現在,我們只需爲每個子模塊的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命令時,這些項目會按照依賴順序而被構建。
11、插件和報表
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>
12、總結
Maven2.0 有着許多實用的特點,並且完成任務十分出色。Maven中最值得稱讚的地方就是使用了標準的目錄結構和部署。這就使得開發人員能夠適應不同的項目,並且不用學習任何結構方面新的東西,也不用掌握特殊的指令來構建結構。Maven可以通過純腳本來實現。在文檔方面,由於使用了項目站點構建工具,所以當項目構建完成後,您可以查看所有開發的當前狀態。