maven教程

原文轉載至:http://wentao365.iteye.com/blog/903396

Maven是一個採用純Java編寫的開 源項目管理工具。Maven採用了一種被稱之爲project object model (POM)概念來管理項目,所有的項目配置信息都被定義在一個叫做POM.xml的文件中,通過該文件,Maven可以管理項目的整個聲明週期,包括編 譯,構建,測試,發佈,報告等等。目前Apache下絕大多數項目都已經採用Maven進行管理。而Maven本身還支持多種插件,可以方便更靈活的控制 項目。

1:http://maven.apache.org/download.html 下載最新版本 Maven 3.0.2 (Binary zip)


2:解壓到 D:


3:配置環境變量
   MAVEN_HOME : D:\apache-maven-3.0.2
   MAVEN : %MAVEN_HOME%\bin
  (可選) MAVEN_OPTS : -Xms256m -Xmx512m

   在path 前面 加上 %MAVEN%;


4:驗證安裝是否成功
在命令行上輸入 : mvn -version; 回車,如看到下面信息表示安裝成功:



5:創建項目
在命令行上輸入 :mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app 回車,



如果你是首次運行該命令(goal),maven將要花一些時間去把最新的工具包(Maven 把它叫作artifacts)下載到你的本地倉庫。



命令執行完後你將看到maven生成了一個名爲my-app的目錄,這個名字就是你在命令中指定的artifactId,進入該目錄,你將發現以下標準的項目結構:



其中:src/main/java 目錄包含了項目的源代碼,src/test/java 目錄包含了項目的測試代碼,pom.xml是項目的項目對象模型(Project Object Model or POM)。

6:POM
pom.xml 文件是maven對一個項目的核心配置,這個文件將包含你希望如何構建項目的大多數配置信息。POM大而複雜,但你不用全部去了解,只要使用一些常用的配置就可以了。下面列出這個POM的內容:

引用

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

7:第5步我們做了什麼
引用
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app

執行Maven 命令(goal)archetype:create,並且設置了一些參數( -DgroupId=com.mycompany.app -DartifactId=my-app)

在這個命令中,前綴 archetype 是包含create命令的一個maven的plugin。這個goal命令根據項目原型(符合maven標準的項目模板)建立了一個簡單的項目。

現在可以確定地說,一個maven plugin 就是一些有着相同目的的goals命令的集合,例如 jboss-maven-plugin 這個插件,就是爲了處理各種和jboss相關的任務。

8:Build 項目
在命令行上 輸入 : cd my-app 回車,進入到 項目路徑下



再輸入 mvn package 回車這時命令行將會打印出各種動作,並且以下面一段信息結束:



與首次執行的命令(那是一個goal)
引用
archetype:create

不同,這次執行的只是一個簡單的命令---package。不同於goal,這是一個phase(階段),一個phase是指構建生命週期的一個階段,構建生命週期是指有序的一系列phase。當給出一個phase,Maven將執行所有的在此階段前的phase及其自身,例如,如果我們執行compile階段,實際上執行的階段有:
引用
validate
generate-sources
process-sources
generate-resources
process-resources
compile

你可以使用以下的命令來測試新編譯和打包出來的jar包,
引用
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

這時將打印出最經典的:
引用
Hello World!



9:運行Maven工具

雖然很難列出一張非常全面的表,但在此可先列出最普通的默認的生命週期階段:
引用
validate:驗證工程是否正確,所有需要的資源是否可用。
compile:編譯項目的源代碼。  
test:使用合適的單元測試框架來測試已編譯的源代碼。這些測試不需要已打包和佈署。
Package:把已編譯的代碼打包成可發佈的格式,比如jar。
integration-test:如有需要,將包處理和發佈到一個能夠進行集成測試的環境。
verify:運行所有檢查,驗證包是否有效且達到質量標準。
install:把包安裝在本地的repository中,可以被其他工程作爲依賴來使用。
Deploy:在集成或者發佈環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
clean:清除先前構建的artifacts(在maven中,把由項目生成的包都叫作artifact)。
site:爲項目生成文檔站點。
 
上面列出的各個Phases(階段)實際上對應着潛在的goals,特殊的每個階段執行的特殊的goals由項目的類型所決定,例如:如果項目的類型是jar,package階段將默認執行jar:jar的goals,如果項目類型是war,那麼package階段執行的goals將是war:war。
有件有趣的事情需要注意,那就是phases和goals需要按一定的順序來執行。
mvn clean dependency:copy-dependencies package
這個命令將先清除項目,然後拷貝依賴,最後把項目打包,當然,在打包之前,會先執行此階段之前的階段.如compile,test等.
生成站點
mvn site
這個階段生成基於pom.xml配置的項目信息。你可以在target/site目錄下看到生成的文檔。

一:編寫POM

引用
<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/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

1:project是所有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/xsd/maven-4.0.0.xsd">


</project>

它還聲明瞭一些POM相關的命名空間及xsd元素,雖然這些屬性不是必須的,但使用這些屬性能夠讓第三方工具(如IDE中的XML編輯器)幫助我們快速編輯POM。

2:<modelVersion>4.0.0</modelVersion>
根元素下的第一個子元素modelVersion指定了當前POM模型的版本,對於Maven2及Maven 3來說,它只能是4.0.0。

3:groupId,artifactId和version三行
pom.xml中最重要的是groupId,artifactId和version三行。這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者war都是以基於這些基本的座標進行區分的。

3.1:groupId
定義了項目屬於哪個組,這個組往往和項目所在的組織或公司存在關聯,譬如你的公司是mycom,有一個項目爲myapp,那麼groupId就應該是com.mycom.myapp。

3.2:artifactId
定義了當前Maven項目在組中唯一的ID,在前面的groupId爲com.mycompany.app的例子中,你可能會爲不同的子項目(模塊)分配artifactId,如:myapp-util、myapp-domain、myapp-web等等。本例中artifactId 爲 my-app

3.3:version
顧名思義,version指定了項目當前的版本。
引用
<version>1.0-SNAPSHOT</version>

SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的版本。隨着項目的發展,version會不斷更新,如升級爲1.1-SNAPSHOT、1.0、1.1、2.0等等。本書的6.5小節會詳細介紹SNAPSHOT,第13章介紹如何使用Maven管理項目版本的升級發佈。

4:name元素
聲明瞭一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但我還是推薦爲每個POM聲明name,以方便信息交流。


沒有任何實際的Java代碼,我們就能夠定義一個Maven項目的POM,這體現了Maven的一大優點,它能讓項目對象模型最大程度地與實際代碼相獨立,我們可以稱之爲解耦,或者正交性,這在很大程度上避免了Java代碼和POM代碼的相互影響。比如當項目需要升級版本時,只需要修改POM,而不需要更改Java代碼;而在POM穩定之後,日常的Java代碼開發工作基本不涉及POM的修改。

二:編寫主代碼

1:主代碼的位置:
項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(比如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven假設項目主代碼位於src/main/java目錄。我們遵循Maven的約定,創建該目錄,然後在該目錄下創建文件com/mycompany/app/App.java

引用
package com.mycompany.app;

/**
* Hello world!
*
*/
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}


2:注意事項:
關於該Java代碼有兩點需要注意。首先,在95%以上的情況下,我們應該把項目主代碼放到src/main/java/目錄下(遵循Maven的約定),而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼。其次,該Java類的包名是com.mycompany.app 或者 com.mycompany.app.my-app,這與我們之前在POM中定義的groupId和artifactId相吻合。一般來說,項目中Java類的包都應該基於項目的groupId和artifactId,這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。

3:編譯主代碼:
代碼編寫完畢後,我們使用Maven進行編譯,在項目根目錄下運行命令 mvn clean compile ,我們會得到如下輸出:



clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項目主代碼,從輸出中我們看到Maven:
引用
首先執行了clean:clean任務,刪除target/目錄,默認情況下Maven構建的所有輸出都在target/目錄中;
接着執行resources:resources任務(未定義項目資源,暫且略過);
最後執行compiler:compile任務,將項目主代碼編譯至target/classes目錄

    上文提到的clean:clean、resources:resources,以及compiler:compile對應了一些Maven插件及插件目標,比如clean:clean是clean插件的clean目標,compiler:compile是compiler插件的compile目標,後文會詳細講述Maven插件及其編寫方法。

    至此,Maven在沒有任何額外的配置的情況下就執行了項目的清理和編譯任務,接下來,我們編寫一些單元測試代碼並讓Maven執行自動化測試。

三:編寫測試代碼

1:在pom.xml中增加junit依賴
Maven項目中默認的測試代碼目錄是src/test/java,在Java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實上的單元測試標準。要使用JUnit,pom.xml中要有下列代碼:
引用
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

dependencies元素下可以包含多個dependency元素以聲明項目的依賴,這裏我們有一個依賴groupId是junit,artifactId是junit,version是4.7。前面我們提到groupId、artifactId和version是任何一個Maven項目最基本的座標,JUnit也不例外,有了這段聲明,Maven就能夠自動下載junit-4.7.jar。也許你會問,Maven從哪裏下載這個jar呢?在Maven之前,我們可以去JUnit的官網下載分發包。而現在有了Maven,它會自動訪問中央倉庫(http://repo1.maven.org/maven2/),下載需要的文件。讀者也可以自己訪問該倉庫,打開路徑junit/junit/4.7/,就能看到junit-4.7.pom和junit-4.7.jar。本書第6章會詳細介紹Maven倉庫及中央倉庫。

上述POM代碼中還有一個值爲test的元素scope,scope爲依賴範圍,若依賴範圍爲test則表示該依賴只對測試有效,換句話說,測試代碼中的import JUnit代碼是沒有問題的,但是如果我們在主代碼中用import JUnit代碼,就會造成編譯錯誤。如果不聲明依賴範圍,那麼默認值就是compile,表示該依賴對主代碼和測試代碼都有效。

2:編寫測試代碼



3:調用Maven執行測試
運行 mvn clean test :



四:打包和運行

將項目進行編譯、測試之後,下一個重要步驟就是打包(package)。POM中沒有指定打包類型,使用默認打包類型jar,我們可以簡單地執行命令 mvn clean package 進行打包。類似地,Maven會在打包之前執行編譯、測試等操作。這裏我們看到jar:jar任務負責打包,實際上就是jar插件的jar目標將項目主代碼打包成一個名爲hello-world-1.0-SNAPSHOT.jar的文件,該文件也位於target/輸出目錄中,它是根據artifact-version.jar規則進行命名的,如有需要,我們還可以使用finalName來自定義該文件的名稱,這裏暫且不展開,本書後面會詳細解釋。

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