maven 學習總結

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的標準目錄結構如下:

maven 學習總結 - jean - jean

使用目錄模板,可以使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、項目開發

61創建項目的步驟

生成項目佈局: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可以通過純腳本來實現。在文檔方面,由於使用了項目站點構建工具,所以當項目構建完成後,您可以查看所有開發的當前狀態。

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