maven學習講解

參考連接:http://www.cnblogs.com/bigtall/archive/2011/03/23/1993253.html

1.前言

Maven,發音是[`meivin],"專家"的意思。它是一個很好的項目管理工具,很早就進入了個人必備工具行列,可是此次爲了把project1項目徹底遷移並應用maven,因此對maven進行了一些深刻的學習。寫這個學習筆記的目的,一個是爲了本身備忘,二則但願可以爲其餘人學習使用maven 縮短一些時間。css

2. maven概要

首先我把maven的概念快速的梳理一下,讓咱們快速地創建起一個比較精確的maven應用場景。html

2.1 maven不是什麼

讀書時候要先限定範圍,避免一些有害的遐想。要說maven不是什麼,咱們能夠從以下幾個要點來展開java

  1. maven不是ant,也不是make。 
    咱們之前接觸的構建工具,須要寫一些詳細的步驟,好比: compile project1/src/*.java 等相似的語句。這些語句正是咱們使用ant和make所要編寫的東西。maven採用了"約定優於配置"的方法,一些開發經常使用的操做和步驟已經固化在 maven中,因此使用者再也不須要去編寫那些煩人的語句了。同時,maven內置了開發流程的支持,它不只可以編譯,一樣可以打包、發佈,也可以一鼓作氣作完這些全部的步驟。
  2. maven不是ivy 
    依賴管理是maven的功能之一,雖然不少人包括我之前都是隻用它的依賴管理功能,可是要深刻運用的話,咱們就能夠看到更多的內容。更重要的是,maven在依賴關係中加入了scope的概念,進一步細化了依賴關係的劃分。

2.2 maven是什麼

maven將本身定位爲一個項目管理工具。它負責管理項目開發過程當中的幾乎全部的東西:mysql

  1. 版本 
    maven有本身的版本定義和規則
  2. 構建 
    maven支持許多種的應用程序類型,對於每一種支持的應用程序類型都定義好了一組構建規則和工具集。
  3. 輸出物管理 
    maven能夠管理項目構建的產物,並將其加入到用戶庫中。這個功能能夠用於項目組和其餘部門之間的交付行爲。
  4. 依賴關係 
    maven對依賴關係的特性進行細緻的分析和劃分,避免開發過程當中的依賴混亂和相互污染行爲
  5. 文檔和構建結果 
    maven的site命令支持各類文檔信息的發佈,包括構建過程的各類輸出,javadoc,產品文檔等。
  6. 項目關係 
    一個大型的項目一般有幾個小項目或者模塊組成,用maven能夠很方便地管理
  7. 移植性管理 
    maven能夠針對不一樣的開發場景,輸出不一樣種類的輸出結果。

2.3 maven的生命週期

maven把項目的構建劃分爲不一樣的生命週期(lifecycle),在我看來,劃分的已是很是仔細了,你們能夠參考這裏 。粗略一點的話,它這個過程(phase)包括:編譯、測試、打包、集成測試、驗證、部署。maven中全部的執行動做(goal)都須要指明本身在這個過程當中的執行位置,而後maven執行的時候,就依照過程的發展依次調用這些goal進行各類處理。linux

這個也是maven的一個基本調度機制。通常來講,位置稍後的過程都會依賴於以前的過程。固然,maven一樣提供了配置文件,能夠依照用戶要求,跳過某些階段。c++

2.4 maven的"約定優於配置"

所謂的"約定優於配置",在maven中並非徹底不能夠修改的,他們只是一些配置的默認值而已。可是使用者除非必要,並不須要去修改那些約定內容。maven默認的文件存放結構以下:web

  • /項目目錄
    • pom.xml 用於maven的配置文件
    • /src 源代碼目錄
      • /src/main 工程源代碼目錄
        • /src/main/java 工程java源代碼目錄
      • /src/main/resource 工程的資源目錄
      • /src/test 單元測試目錄
        • /src/test/java
    • /target 輸出目錄,全部的輸出物都存放在這個目錄下
      • /target/classes 編譯以後的class文件

每個階段的任務都知道怎麼正確完成本身的工做,好比compile任務就知道從src/main/java下編譯全部的java文件,並把它的輸出class文件存放到target/classes中。算法

對maven來講,採用"約定優於配置"的策略能夠減小修改配置的工做量,也能夠下降學習成本,更重要的是,給項目引入了統一的規範。spring

2.5 maven的版本規範

maven使用以下幾個要素來惟必定位某一個輸出物: groupId:artifactId:packaging:version 。好比org.springframework:spring:2.5 。每一個部分的解釋以下:sql

  • groupId 
    團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以建立這個項目的組織名稱的逆向域名(reverse domain name)開頭。來自Sonatype的項目有一個以com.sonatype開頭的groupId,而Apache Software的項目有以org.apache開頭的groupId。
  • artifactId 
    在groupId下的表示一個單獨項目的惟一標識符。好比咱們的tomcat, commons等。不要在artifactId中包含點號(.)。
  • version 
    一個項目的特定版本。發佈的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目能夠用一個特殊的標識,這種標識給版本加上一個"SNAPSHOT"的標記。 
    雖然項目的打包格式也是Maven座標的重要組成部分,可是它不是項目惟一標識符的一個部分。一個項目的 groupId:artifactId:version使之成爲一個獨一無二的項目;你不能同時有一個擁有一樣的groupId, artifactId和version標識的項目。
  • packaging 
    項目的類型,默認是jar,描述了項目打包後的輸出。類型爲jar的項目產生一個JAR文件,類型爲war的項目產生一個web應用。
  • classifier 
    不多使用的座標,通常均可以忽略classifiers。若是你要發佈一樣的代碼,可是因爲技術緣由須要生成兩個單獨的構件,你就要使用一個分類器(classifier)。例如,若是你想要構建兩個單獨的構件成JAR,一個使用Java 1.4編譯器,另外一個使用Java 6編譯器,你就可使用分類器來生成兩個單獨的JAR構件,它們有一樣的groupId:artifactId:version組合。若是你的項目使用本地擴展類庫,你可使用分類器爲每個目標平臺生成一個構件。分類器經常使用於打包構件的源碼,JavaDoc或者二進制集合。

maven有本身的版本規範,通常是以下定義 <major version>.<minor version>.<incremental version>-<qualifier>,好比1.2.3-beta-01。要說明的是,maven本身判斷版本的算法是major,minor,incremental部分用數字比較,qualifier部分用字符串比較,因此要當心 alpha-2和alpha-15的比較關係,最好用 alpha-02的格式。

maven在版本管理時候可使用幾個特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。好比"1.0-SNAPSHOT"。各個部分的含義和處理邏輯以下說明:

  • SNAPSHOT 
    若是一個版本包含字符串"SNAPSHOT",Maven就會在安裝或發佈這個組件的時候將該符號展開爲一個日期和時間值,轉換爲UTC時間。例如,"1.0-SNAPSHOT"會在2010年5月5日下午2點10分發布時候變成1.0-20100505-141000-1。 
    這個詞只能用於開發過程當中,由於通常來講,項目組都會頻繁發佈一些版本,最後實際發佈的時候,會在這些snapshot版本中尋找一個穩定的,用於正式發佈,好比1.4版本發佈以前,就會有一系列的1.4-SNAPSHOT,而實際發佈的1.4,也是從中拿出來的一個穩定版。
  • LATEST 
    指某個特定構件的最新發布,這個發佈多是一個發佈版,也多是一個snapshot版,具體看哪一個時間最後。
  • RELEASE 
    指最後一個發佈版。

2.6 maven的組成部分

maven把整個maven管理的項目分爲幾個部分,一個部分是源代碼,包括源代碼自己、相關的各類資源,一個部分則是單元測試用例,另一部分則是各類maven的插件。對於這幾個部分,maven能夠獨立管理他們,包括各類外部依賴關係。

2.7 maven的依賴管理

依賴管理通常是最吸引人使用maven的功能特性了,這個特性讓開發者只須要關注代碼的直接依賴,好比咱們用了spring,就加入spring依賴說明就能夠了,至於spring本身還依賴哪些外部的東西,maven幫咱們搞定。

任意一個外部依賴說明包含以下幾個要素:groupId, artifactId, version, scope, type, optional。其中前3個是必須的,各自含義以下:

  • groupId 必須
  • artifactId 必須
  • version 必須。 
    這裏的version能夠用區間表達式來表示,好比(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,好比[1,3),[5,7]。
  • scope 做用域限制
  • type 通常在pom引用依賴時候出現,其餘時候不用
  • optional 是否可選依賴

maven認爲,程序對外部的依賴會隨着程序的所處階段和應用場景而變化,因此maven中的依賴關係有做用域(scope)的限制。在maven中,scope包含以下的取值:

  • compile(編譯範圍) 
    compile是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在全部的classpath中可用,同時它們也會被打包。
  • provided(已提供範圍) 
    provided依賴只有在當JDK或者一個容器已提供該依賴以後才使用。例如,若是你開發了一個web應用,你可能在編譯classpath中須要可用的Servlet API來編譯一個servlet,可是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供範圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
  • runtime(運行時範圍) 
    runtime依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你可能在編譯的時候只須要JDBC API JAR,而只有在運行的時候才須要JDBC驅動實現。
  • test(測試範圍) 
    test範圍依賴 在通常的 編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。測試範圍依賴在以前的???中介紹過。
  • system(系統範圍) 
    system範圍依賴與provided相似,可是你必須顯式的提供一個對於本地系統中JAR文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。 若是你將一個依賴範圍設置成系統範圍,你必須同時提供一個systemPath元素 。注意該範圍是不推薦使用的(你應該一直儘可能去從公共或定製的Maven倉庫中引用依賴)。

另外,代碼有代碼本身的依賴,各個maven使用的插件也能夠有本身的依賴關係。依賴也能夠是可選的,好比咱們代碼中沒有任何cache依賴,可是hibernate可能要配置cache,因此該cache的依賴就是可選的。

2.8 多項目管理

maven的多項目管理也是很是強大的。通常來講,maven要求同一個工程的全部子項目都放置到同一個目錄下,每個子目錄表明一個項目,好比

  • 總項目/
    • pom.xml 總項目的pom配置文件
    • 子項目1/
      • pom.xml 子項目1的pom文件
    • 子項目2/
      • pom.xml 子項目2的pom文件

按照這種格式存放,就是繼承方式,全部具體子項目的pom.xml都會繼承總項目pom的內容,取值爲子項目pom內容優先。

要設置繼承方式,首先要在總項目的pom中加入以下配置

<modules> 
    <module>simple-weather</module> 
    <module>simple-webapp</module> 
</modules>

        

其次在每一個子項目中加入

<parent> 
    <groupId>org.sonatype.mavenbook.ch06</groupId> 
    <artifactId>simple-parent</artifactId> 
    <version>1.0</version> 
</parent>  

便可。

固然,繼承不是惟一的配置文件共用方式,maven還支持引用方式。引用pom的方式更簡單,在依賴中加入一個type爲pom的依賴便可。

 

複製代碼
<project> 
    <description>This is a project requiring JDBC</description> 
    ... 
    <dependencies> 
        ... 
        <dependency> 
            <groupId>org.sonatype.mavenbook</groupId> 
            <artifactId>persistence-deps</artifactId> 
            <version>1.0</version> 
            <type>pom</type> 
        </dependency> 
    </dependencies> 
</project>
複製代碼

        

 

2.9 屬性

用戶能夠在maven中定義一些屬性,而後在其餘地方用${xxx}進行引用。好比:

 

複製代碼
<project> 
    <modelVersion>4.0.0</modelVersion> 
    ... 
    <properties> 
        <var1>value1</var1> 
    </properties> 
</project>
複製代碼

maven提供了三個隱式的變量,用來訪問系統環境變量、POM信息和maven的settings:

  • env 
    暴露操做系統的環境變量,好比env.PATH
  • project 
    暴露POM中的內容,用點號(.)的路徑來引用POM元素的值,好比${project.artifactId}。另外,java的系統屬性好比user.dir等,也暴露在這裏。
  • settings 
    暴露maven的settings的信息,也能夠用點號(.)來引用。maven把系統配置文件存放在maven的安裝目錄中,把用戶相關的配置文件存放在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。

2.10 maven的profile

profile是maven的一個重要特性,它可讓maven可以自動適應外部的環境變化,好比同一個項目,在linux下編譯linux的版本,在win下編譯win的版本等。一個項目能夠設置多個profile,也能夠在同一時間設置多個profile被激活(active)的。自動激活的 profile的條件能夠是各類各樣的設定條件,組合放置在activation節點中,也能夠經過命令行直接指定。profile包含的其餘配置內容能夠覆蓋掉pom定義的相應值。若是認爲profile設置比較複雜,能夠將全部的profiles內容移動到專門的 profiles.xml 文件中,不過記得和pom.xml放在一塊兒。

activation節點中的激活條件中常見的有以下幾個:

  1. os 
    判斷操做系統相關的參數,它包含以下能夠自由組合的子節點元素
    • message - 規則失敗以後顯示的消息
    • arch - 匹配cpu結構,常見爲x86
    • family - 匹配操做系統家族,常見的取值爲:dos,mac,netware,os/2,unix,windows,win9x,os/400等
    • name - 匹配操做系統的名字
    • version - 匹配的操做系統版本號
    • display - 檢測到操做系統以後顯示的信息
  2. jdk 
    檢查jdk版本,能夠用區間表示。
  3. property 
    檢查屬性值,本節點能夠包含name和value兩個子節點。
  4. file 
    檢查文件相關內容,包含兩個子節點:exists和missing,用於分別檢查文件存在和不存在兩種狀況。

3. maven的操做和使用

maven的操做有兩種方式,一種是經過mvn命令行命令,一種是使用maven的eclipse插件。由於使用eclipse的maven插件操做起來比較容易,這裏就只介紹使用mvn命令行的操做。

3.1 maven的配置文件

maven的主執行程序爲mvn.bat,linux下爲mvn.sh,這兩個程序都很簡單,它們的共同用途就是收集一些參數,而後用 java.exe來運行maven的Main函數。maven一樣須要有配置文件,名字叫作settings.xml,它放在兩個地方,一個是maven 安裝目錄的conf目錄下,對全部使用該maven的用戶都起做用,咱們稱爲主配置文件,另一個放在 %USERPROFILE%/.m2/settings.xml下,咱們成爲用戶配置文件,只對當前用戶有效,且能夠覆蓋主配置文件的參數內容。還有就是項目級別的配置信息了,它存放在每個maven管理的項目目錄下,叫pom.xml,主要用於配置項目相關的一些內容,固然,若是有必要,用戶也能夠在 pom中寫一些配置,覆蓋住配置文件和用戶配置文件的設置參數內容。

通常來講,settings文件配置的是好比repository庫路徑之類的全局信息,具體能夠參考官方網站的文章 。

3.2 建立新工程

要建立一個新的maven工程,咱們須要給咱們的工程指定幾個必要的要素,就是maven產品座標的幾個要素:groupId, artifactId,若是願意,你也能夠指定version和package名稱。咱們先看一個簡單的建立命令:

d:\work\temp>mvn archetype:create -DgroupId=com.abc -DartifactId=product1 -DarchetypeArtifactId=maven-archetype-webapp

首先看這裏的命令行參數的傳遞結構,怪異的 -D參數=值 的方式是 java.exe 要求的方式。這個命令建立一個web工程,目錄結構是一個標準的maven結構,以下:

複製代碼
D:. 
└─mywebapp 
    │  pom.xml 
    │ 
    └─src 
        └─main 
            ├─resources 
            └─webapp 
                │  index.jsp 
                │ 
                └─WEB-INF 
                    web.xml
複製代碼

你們要注意,這裏目錄結構的佈局其實是由參數 archetypeArtifactId 來決定的,由於這裏傳入的是 maven-archetype-webapp 若是咱們傳入其餘的就會建立不一樣的結構,默認值爲 maven-archetype-quickstart ,有興趣的讀者能夠參考更詳細的列表 ,我把部分經常使用的列表在這裏:

Artifact Group Version Repository Description
maven-archetype-j2ee-simple org.apache.maven.archetypes     A simple J2EE Java application
maven-archetype-marmalade-mojo org.apache.maven.archetypes     A Maven plugin development project using marmalade
maven-archetype-plugin org.apache.maven.archetypes     A Maven Java plugin development project
maven-archetype-portlet org.apache.maven.archetypes     A simple portlet application
maven-archetype-profiles org.apache.maven.archetypes      
maven-archetype-quickstart org.apache.maven.archetypes      
maven-archetype-simple org.apache.maven.archetypes      
maven-archetype-site-simple org.apache.maven.archetypes     A simple site generation project
maven-archetype-site org.apache.maven.archetypes     A more complex site project
maven-archetype-webapp org.apache.maven.archetypes     A simple Java web application
maven-archetype-har net.sf.maven-har 0.9   Hibernate Archive
maven-archetype-sar net.sf.maven-sar 0.9   JBoss Service Archive

你們能夠參考更詳細的 archetype:create 幫助 和 archtype參考信息 。

3.3 maven的多項目管理

多項目管理是maven的主要特點之一,對於一個大型工程,用maven來管理他們之間複雜的依賴關係,是再好不過了。maven的項目配置之間的關係有兩種:繼承關係和引用關係。 
maven默認根據目錄結構來設定pom的繼承關係,即下級目錄的pom默認繼承上級目錄的pom。要設定二者之間的關係很簡單,上級pom以下設置:

<modules> 
    <module>ABCCommon</module> 
    <module>ABCCore</module> 
    <module>ABCTools</module> 
</modules>
 

要記住的是,這裏的module是目錄名,不是子工程的artifactId。子工程以下設置:

 

複製代碼
<parent> 
    <groupId>com.abc.product1</groupId> 
    <artifactId>abc-product1</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
</parent> 
<artifactId>abc-my-module2</artifactId> 
<packaging>jar</packaging>
複製代碼
 

這樣二者就相互關聯起來了,繼承關係就設定完畢,全部父工程的配置內容都會自動在子工程中生效,除非子工程有相同的配置覆蓋。若是你不喜歡層層遞進的目錄結構來實現繼承,也能夠在parent中加入 <relativePath>../a-parent/pom.xml</relativePath> 來制定parent項目的相對目錄。繼承關係一般用在項目共同特性的抽取上,經過抽取公共特性,能夠大幅度減小子項目的配置工做量。

引用關係是另一種複用的方式,maven中配置引用關係也很簡單,加入一個 type 爲 pom 的依賴便可。

<dependency> 
    <groupId>org.sonatype.mavenbook</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <type>pom</type> 
</dependency>
 

可是不管是父項目仍是引用項目,這些工程都必須用 mvn install 或者 mvn deploy 安裝到本地庫才行,不然會報告依賴沒有找到,eclipse編譯時候也會出錯。

須要特別提出的是複用過程當中,父項目的pom中能夠定義 dependencyManagement 節點,其中存放依賴關係,可是這個依賴關係只是定義,不會真的產生效果,若是子項目想要使用這個依賴關係,能夠在自己的 dependency 中添加一個簡化的引用

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring</artifactId> 
</dependency>
 

這種方法能夠避免版本號滿天飛的狀況。

3.4 安裝庫文件到maven庫中

在maven中通常都會用到安裝庫文件的功能,一則是咱們經常使用的hibernate要使用jmx庫,可是由於sun的license限制,因此沒法將其直接包含在repository中。因此咱們使用mvn命令把jar安裝到咱們本地的repository中

mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

若是咱們想把它安裝到公司的repository中,須要使用命令

mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://xxx.ss.com/sss.xxx -DrepositoryId=release-repo

對於咱們的工程輸出,若是須要放置到公司的repository中的話,能夠經過配置pom來實現

複製代碼
<distributionManagement> 
    <repository> 
        <id>mycompany-repository</id> 
        <name>MyCompany Repository</name> 
        <url>scp://repository.mycompany.com/repository/maven2</url> 
    </repository> 
</distributionManagement>
複製代碼

這裏使用的scp方式提交庫文件,還有其餘方式可使用,請參考faq部分。而後記得在你的settings.xml中加入這一內容

 

複製代碼
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
          http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
    ... 
    <servers> 
        <server> 
            <id>mycompany-repository</id> 
            <username>jvanzyl</username> 
            <!-- Default value is ~/.ssh/id_dsa --> 
            <privateKey>/path/to/identity</privateKey> 
            <passphrase>my_key_passphrase</passphrase> 
        </server> 
    </servers> 
    ... 
</settings>
複製代碼

        

 

 

3.5 maven的變量

maven定義了不少變量屬性,參考這裏 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

  1. 內置屬性
    • ${basedir } represents the directory containing pom.xml
    • ${version } equivalent to ${project.version } or ${pom.version }
  2. Pom/Project properties 
    全部pom中的元素均可以用 project. 前綴進行引用,如下是部分經常使用的
    • ${project.build.directory } results in the path to your "target" dir, this is the same as${pom.project.build.directory }
    • ${project.build. outputD irectory } results in the path to your "target/classes" dir
    • ${project.name } refers to the name of the project.
    • ${project.version } refers to the version of the project.
    • ${project.build.finalName } refers to the final name of the file created when the built project is packaged
  3. 本地用戶設定 
    全部用的的 settings.xml 中的設定均可以經過 settings. 前綴進行引用
    • ${settings.localRepository } refers to the path of the user's local repository.
    • ${maven.repo.local } also works for backward compatibility with maven1 ??
  4. 環境變量 
    系統的環境變量經過 env. 前綴引用
    • ${env.M2_HOME } returns the Maven2 installation path.
    • ${java.home } specifies the path to the current JRE_HOME environment use with relative paths to get for example: 
      <jvm>${java.home}../bin/java.exe</jvm>
  5. java系統屬性 
    全部JVM中定義的java系統屬性.
  6. 用戶在pom中定義的自定義屬性
    複製代碼
    <project> 
        ... 
        <properties> 
            <my.filter.value>hello</my.filter.value> 
        </properties> 
        ... 
    </project> 
    複製代碼
    則引用 ${my.filter.value } 就會獲得值  hello 
  7. 上級工程的變量 
    上級工程的pom中的變量用前綴 ${project.parent } 引用. 上級工程的版本也能夠這樣引用: ${parent.version }.

3.6 maven的使用

咱們已經知道maven預約義了許多的階段(phase),每一個插件都依附於這些階段,而且在進入某個階段的時候,調用運行這些相關插件的功能。咱們先來看完整的maven生命週期:

生命週期 階段描述
validate 驗證項目是否正確,以及全部爲了完整構建必要的信息是否可用
generate-sources 生成全部須要包含在編譯過程當中的源代碼
process-sources 處理源代碼,好比過濾一些值
generate-resources 生成全部須要包含在打包過程當中的資源文件
process-resources 複製並處理資源文件至目標目錄,準備打包
compile 編譯項目的源代碼
process-classes 後處理編譯生成的文件,例如對Java類進行字節碼加強(bytecode enhancement)
generate-test-sources 生成全部包含在測試編譯過程當中的測試源碼
process-test-sources 處理測試源碼,好比過濾一些值
generate-test-resources 生成測試須要的資源文件
process-test-resources 複製並處理測試資源文件至測試目標目錄
test-compile 編譯測試源碼至測試目標目錄
test 使用合適的單元測試框架運行測試。這些測試應該不須要代碼被打包或發佈
prepare-package 在真正的打包以前,執行一些準備打包必要的操做。這一般會產生一個包的展開的處理過的版本(將會在Maven 2.1+中實現)
package 將編譯好的代碼打包成可分發的格式,如JAR,WAR,或者EAR
pre-integration-test 執行一些在集成測試運行以前須要的動做。如創建集成測試須要的環境
integration-test 若是有必要的話,處理包併發布至集成測試能夠運行的環境
post-integration-test 執行一些在集成測試運行以後須要的動做。如清理集成測試環境。
verify 執行全部檢查,驗證包是有效的,符合質量規範
install 安裝包至本地倉庫,以備本地的其它項目做爲依賴使用
deploy 複製最終的包至遠程倉庫,共享給其它開發人員和項目(一般和一次正式的發佈相關)

maven核心的插件列表能夠參考 http://maven.apache.org/plugins/index.html 。這裏僅列舉幾個經常使用的插件及其配置參數:

  1. clean插件 
    只包含一個goal叫作 clean:clean ,負責清理構建時候建立的文件。 默認清理的位置是以下幾個變量指定的路徑project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory 。
  2. compiler插件 
    包含2個goal,分別是 compiler:compile 和 compiler:testCompile 。能夠到這裏查看二者的具體參數設置:compiletestCompile 。
  3. surefire插件 
    運行單元測試用例的插件,而且可以生成報表。包含一個goal爲 surefire:test 。主要參數testSourceDirectory用來指定測試用例目錄,參考完整用法幫助
  4. jar 
    負責將工程輸出打包到jar文件中。包含兩個goal,分別是 jar:jar , jar:test-jar 。兩個goal負責從classesDirectory或testClassesDirectory中獲取全部資源,而後輸出jar文件到outputDirectory中。
  5. war 
    負責打包成war文件。經常使用goal有 war:war ,負責從warSourceDirectory(默認${basedir}/src/main/webapp)打包全部資源到outputDirectory中。
  6. resources 
    負責複製各類資源文件,經常使用goal有 resources:resources ,負責將資源文件複製到outputDirectory中,默認爲${project.build.outputDirectory}。
  7. install 
    負責將項目輸出(install:install)或者某個指定的文件(install:install-file)加入到本機庫%USERPROFILE%/.m2/repository中。能夠用 install:help 尋求幫助。
  8. deploy 
    負責將項目輸出(deploy:deploy)或者某個指定的文件(deploy:deploy-file)加入到公司庫中。
  9. site 
    將工程全部文檔生成網站,生成的網站界面默認和apache的項目站點相似,可是其文檔用doxia格式寫的,目前不支持docbook,須要用其餘插件配合才能支持。須要指出的是,在maven 2.x系列中和maven3.x的site命令處理是不一樣的,在舊版本中,用 mvn site 命令能夠生成reporting節點中的全部報表,可是在maven3中,reporting過期了,要把這些內容做爲 maven-site-plugin的configuration的內容才行。詳細內容能夠參考http://www.wakaleo.com/blog/292-site-generation-in-maven-3 

4. maven的使用問答

除了如下的幾個faq條目以外,還有一些faq能夠參考

  1. maven 本身的FAQ

兄弟們若是有其餘問題,歡迎跟帖提問!

4.1 依賴關係

1) 問:如何增長刪除一個依賴關係?

答:直接在pom文件中加入一個dependency節點,若是要刪除依賴,把對應的dependency節點刪除便可。

2) 問:如何屏蔽一個依賴關係?好比項目中使用的libA依賴某個庫的1.0版,libB以來某個庫的2.0版,如今想統一使用2.0版,如何去掉1.0版的依賴?

答:設置exclusion便可。

複製代碼
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate</artifactId> 
    <version>3.2.5.ga</version> 
    <exclusions> 
        <exclusion> 
            <groupId>javax.transaction</groupId> 
            <artifactId>jta</artifactId> 
        </exclusion> 
    </exclusions> 
</dependency>
複製代碼
 
3) 問:我有一些jar文件要依賴,可是我又不想把這些jar去install到mvn的repository中去,怎麼作配置?

答:加入一個特殊的依賴關係,使用system類型,以下:

複製代碼
<dependency> 
    <groupId>com.abc</groupId> 
    <artifactId>my-tools</artifactId> 
    <version>2.5.0</version> 
    <type>jar</type> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/mylib1.jar</systemPath> 
</dependency>
複製代碼
可是要記住,發佈的時候不會複製這個jar。須要手工配置,並且其餘project依賴這個project的時候,會報告警告。若是沒有特殊要求,建議直接註冊發佈到repository。
4) 問:在eclipse環境中同時使用maven builder和eclipse builder,而且設置項目依賴關係以後,爲何編譯會出現artifact找不到錯誤,可是直接使用命令行mvn構建則一切正常?

答:在project屬性中去掉java build path中對其餘 project 的依賴關係,直接在pom中設置依賴關係便可

<!-- 依賴的其餘項目 --> 
<dependency> 
    <groupId>com.abc.project1</groupId> 
    <artifactId>abc-project1-common</artifactId> 
    <version>${project.version}</version> 
</dependency>
另外,保證沒有其餘錯誤。
5) 問:我想讓輸出的jar包自動包含全部的依賴

答:使用 assembly 插件便可。

複製代碼
<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
        <descriptorRefs> 
            <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
    </configuration> 
</plugin>
複製代碼
 
6) 問:個人測試用例依賴於其餘工程的測試用例,如何設置?

答:maven自己在發佈的時候,能夠發佈單純的jar,也能夠同時發佈xxx-tests.jar和xxx-javadoc.jar(你們常常在repository中能夠看到相似的東西)。咱們本身的項目A要同時輸出test.jar能夠作以下的設置

複製代碼
<!-- 用於把test代碼也作成一個jar --> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
        <execution> 
            <goals> 
                <goal>test-jar</goal> 
            </goals> 
        </execution> 
    </executions> 
</plugin>
複製代碼
而後在其餘須要引用的工程B中作以下的dependency設置
 
複製代碼
<dependency> 
    <groupId>com.abc.XXX</groupId> 
    <artifactId>工程A</artifactId> 
    <version>${project.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency>
複製代碼
 
7)如何讓maven將工程依賴的jar複製到WEB-INF/lib目錄下?

 

 
8)我剛剛更新了一下個人nexus庫,可是我沒法在eclipse中用m2eclipse找到我新增的庫文件

修改pom.xml文件,將舊版jar的依賴內容中的版本直接修改成新版本便可。

 

9)我要的jar最新版不在maven的中央庫中,我怎麼辦?

將依賴的文件安裝到本地庫,用以下命令能夠完成:

mvn install:install-file
  -Dfile=<path-to-file>
  -DgroupId=<group-id>
  -DartifactId=<artifact-id>
  -Dversion=<version>
  -Dpackaging=<packaging>
  -DgeneratePom=true

Where: <path-to-file>  the path to the file to load
       <group-id>      the group that the file should be registered under
       <artifact-id>   the artifact name for the file
       <version>       the version of the file
       <packaging>     the packaging of the file e.g. jar     
10)

4.2 變量

1) 問:如何使用變量替換?項目中的某個配置文件好比jdbc.properties使用了一些pom中的變量,如何在發佈中使用包含真實內容的最終結果文件?

答:使用資源過濾功能,好比:

複製代碼
<project> 
    ... 
    <properties> 
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> 
        <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url> 
        <jdbc.username>dev_user</jdbc.username> 
        <jdbc.password>s3cr3tw0rd</jdbc.password> 
    </properties> 
    ... 
    <build> 
        <resources> 
            <resource> 
                <directory>src/main/resources</directory> 
                <filtering>true</filtering> 
            </resource> 
        </resources> 
    </build> 
    ... 
    <profiles> 
        <profile> 
            <id>production</id> 
            <properties> 
                <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName> 
                <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url> 
                <jdbc.username>prod_user</jdbc.username> 
                <jdbc.password>s00p3rs3cr3t</jdbc.password> 
            </properties> 
        </profile> 
    </profiles> 
</project>
複製代碼
2) 問: maven-svn-revision-number-plugin 插件說明

答: maven-svn-revision-number-plugin 能夠從 SVN 中獲取版本號,並將其變成環境變量,交由其餘插件或者profile使用,詳細幫助在這裏 。通常和resource的filter機制同時使用

複製代碼
<plugins> 
    <plugin> 
        <groupId>com.google.code.maven-svn-revision-number-plugin</groupId> 
        <artifactId>maven-svn-revision-number-plugin</artifactId> 
        <version>1.3</version> 
        <executions> 
            <execution> 
                <goals> 
                    <goal>revision</goal> 
                </goals> 
            </execution> 
        </executions> 
        <configuration> 
            <entries> 
                <entry> 
                    <prefix>prefix</prefix> 
                </entry> 
            </entries> 
        </configuration> 
    </plugin> 
</plugins>
複製代碼

這段代碼負責把resource文件中的內容替換成適當內容

複製代碼
repository = ${prefix.repository} 
path = ${prefix.path} 
revision = ${prefix.revision} 
mixedRevisions = ${prefix.mixedRevisions} 
committedRevision = ${prefix.committedRevision} 
status = ${prefix.status} 
specialStatus = ${prefix.specialStatus}
複製代碼
3)個人程序有些單元測試有錯誤,如何忽略測試步驟?

有好幾種方法均可以實現跳過單元測試步驟,一種是給mvn增長命令行參數 -Dmaven.test.skip=true 或者 -DskipTests=true;另一種是給surefire插件增長參數,以下:

<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> [...] </project>
4) 若是隻想運行單個測試用例,可否實現?

能夠,運行時候增長命令行參數 -Dtest=MyTest 便可,其中MyTest是所須要運行的單元測試用例名稱,可是不須要包含package部分。

 

4.3 編譯

1) 問:如何給插件指派參數?好比我要設置一些編譯參數

答:如下內容設定編譯器編譯java1.5的代碼

複製代碼
<project> 
    ... 
    <build> 
        ... 
        <plugins> 
            <plugin> 
                <artifactId>maven-compiler-plugin</artifactId> 
                <configuration> 
                    <source>1.5</source> 
                    <target>1.5</target> 
                </configuration> 
            </plugin> 
        </plugins> 
        ... 
    </build> 
    ... 
</project>
複製代碼

要設置其餘插件的參數也能夠,請參考對應插件的幫助信息

2) 問:個人目錄是非標準的目錄結構,如何設置讓maven支持?

答:指定source目錄和test-source目錄便可。

複製代碼
<build> 
    <directory>target</directory> 
    <sourceDirectory>src</sourceDirectory> 
    <scriptSourceDirectory>js/scripts</scriptSourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 
    <outputDirectory>bin</outputDirectory> 
    <testOutputDirectory>bin</testOutputDirectory> 
</build>
複製代碼

這個例子把源代碼設置成了src目錄,測試代碼在test目錄,因此輸出到bin目錄。這裏要注意,directory若是也設置成bin目錄的話,maven打包的時候會引發死循環,由於directory是全部工做存放的地方,默認包含outputDirectory定義的目錄在內。

3) 我源代碼是UTF8格式的,我如何在maven中指定?

設置一個變量便可

複製代碼
<project> 
    ... 
    <properties> 
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    ... 
</project>
複製代碼

{color:blue}以上是官方給出的解決方案,可是通過嘗試這樣只能影響到resource處理時候的編碼{color},真正有用的是以下配置:

{code:xml}
<build>
  ...
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
  ...
</build>
{code}
. 問:個人項目除了main/java目錄以外,還加了其餘的c++目錄,想要一併編譯,如何作?

答:使用native插件,具體配置方法參考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]

{code:xml}
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
</plugin>    
{code}
. 問:我想要把工程的全部依賴的jar都一塊兒打包,怎麼辦?

答:首先修改maven的配置文件,給maven-assembly-plugin增長一個jar-with-dependencies的描述。

{code:xml}
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
{code}

而後使用命令打包便可:

mvn assembly:assembly
. 問:我想把main/scripts中的內容一塊兒打包發佈,如何作?

答:在pom中配置額外的資源目錄。若是須要的話,還能夠指定資源目錄的輸出位置

{code:xml}
<build>
  ...
  <resources>
    <resource>
      <filtering>true</filtering>
      <directory>src/main/command</directory>
      <includes>
        <include>run.bat</include>
        <include>run.sh</include>
      </includes>
      <targetPath>/abc</targetPath>
    </resource>
    <resource>
      <directory>src/main/scripts</directory>
    </resource>
  </resources>
  ...
</build>
{code}
. 問:我有多個源代碼目錄,可是maven只支持一個main src和一個test src,怎麼辦?

答:使用另一個插件,並仿照以下配置pom

{code:xml}
<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/config/java</source>
                <source>src/main/java</source>
                <source>src/member/java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
{code}
. 問:個人源代碼目錄中有一部分文件我不想讓maven編譯,怎麼作?

答:使用一個maven插件,而後使用includes和excludes。同理,也能夠處理資源的過濾。

{code:xml}
<build>
  <sourceDirectory>http://www.cnblogs.com/src/java</sourceDirectory>
  <plugins>
    <plugin>
      <groupId>com.sun.enterprise</groupId>
      <artifactId>hk2-maven-plugin</artifactId>
      <configuration>
        <includes>
          <include>com/sun/logging/LogDomains.*</include>
          <include>com/sun/enterprise/util/OS.java</include>
          <include>com/sun/enterprise/util/io/FileUtils.java</include>
          <include>com/sun/enterprise/util/zip/**</include>
          <include>com/sun/enterprise/util/i18n/**</include>
          <include>com/sun/enterprise/deployment/backend/IASDeploymentException.java</include>
        </includes>
        <excludes>
          <exclude>com/sun/enterprise/config/ConfigBeansFactory.java</exclude>
          <exclude>com/sun/enterprise/config/clientbeans/**</exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
  <resources>
    <resource>
      <directory>http://www.cnblogs.com/src/java</directory>
      <includes>
        <include>**/*.properties</include>
      </includes>
    </resource>
  </resources>
</build>
{code}
. 問:個人項目是一個純的html組成的項目,沒有任何的java代碼,怎麼跳過編譯過程?

答:配置以下

{code:xml}
<build>
  <sourceDirectory>src/java</sourceDirectory>
  <plugins>
    <plugin>
    <groupId>com.sun.enterprise</groupId>
    <artifactId>hk2-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
{code}
. 問:個人工程裏用hibernate,想在編譯時候自動生成ddl,如何作?

答:添加插件

hibernate3-maven-plugin

,按照以下配置:

{code:xml}
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>hibernate3-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <components>
              <component>
                <name>hbm2ddl</name>
                <implementation>annotationconfiguration</implementation>
              </component>
            </components>
          </configuration>
          <dependencies>
            <dependency>
              <groupId>hsqldb</groupId>
              <artifactId>hsqldb</artifactId>
              <version>${hsqldb.version}</version>
            </dependency>
          </dependencies>
        </plugin>
{code}
. 問:我能用maven支持eclipse RCP項目嗎?

答:固然能夠,你可使用插件 Tycho,詳細內容能夠參考這裏[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/].

 <plugin>
  <groupid>org.sonatype.tycho</groupid>
  <artifactid>target-platform-configuration</artifactid>
  <version>0.7.0</version>
  <configuration>
    <resolver>p2</resolver>
  </configuration>
</plugin>
另外,老牌的pde-maven-plugin就不要用了,已經好幾年沒見更新了。

4.4 ant互動

1) 如何在maven編譯時候運行ant腳本?

使用專門的antrun插件,而且在target標籤內部加入ant的代碼

      <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.6</version> <executions> <execution> <phase> <!-- 生命週期階段 --> </phase> <configuration> <target> <!-- 加入target內部的代碼 --> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>

2)如何在ant腳本中引用maven的classpath?

maven給每個依賴都生成了一個屬性,格式爲"groupId:artifactId[:classifier]:type",好比,若是一下例子就顯示依賴的org.apache.common-util的jar文件路徑

<echo message="Dependency JAR Path: ${org.apache:common-util:jar}"/> 

另外,maven還預約義了四個classpath的引用,他們是

  • maven.compile.classpath
  • maven.runtime.classpath
  • maven.test.classpath
  • maven.plugin.classpath

3)如何使用antrun插件運行外部的build文件?

很簡單,直接在antrun裏邊使用ant指令便可,以下:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.6</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <configuration> <target> <!-- 同時傳遞內置的classpath給外部ant文件 --> <property name="compile_classpath" refid="maven.compile.classpath"/> <property name="runtime_classpath" refid="maven.runtime.classpath"/> <property name="test_classpath" refid="maven.test.classpath"/> <property name="plugin_classpath" refid="maven.plugin.classpath"/> <ant antfile="${basedir}/build.xml"> <target name="test"/> </ant> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
. 問:如何在ant中使用maven的功能?

答:使用ant的[maven task|http://maven.apache.org/ant-tasks/index.html],不過只有ant 1.6以上和jdk 1.5環境才支持。

h4. 測試相關

. 問:如何忽略某個階段的結果?好比單元測試不必定要全正確

答:給插件增長testFailureIgnore參數,並設置爲false。若是要屏蔽該階段,則用

<skip>true</skip>
{code:xml}
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <testFailureIgnore>true</testFailureIgnore>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
{code}
. 問:我如何在maven中加入PMD,CheckStyle,JDepend等檢查功能?

答:加入PMD檢查,如下代碼若是在

reporting

節點中加入則在

mvn site

中執行,若是在

build

節點中加入,則在build的時候自動運行檢查。詳細配置參考[pmd插件使用說明|http://maven.apache.org/plugins/maven-pmd-plugin/]

{code:xml}
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <version>2.5</version>
      </plugin>
    </plugins>
{code}

加入 checkstyle 檢查,詳細配置參考[checkstyle插件使用說明|http://maven.apache.org/plugins/maven-checkstyle-plugin/],一樣注意放置在reporting和build節點中的區別(全部報表類插件都要一樣注意):

{code:xml}
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.5</version>
      </plugin>
{code}

加入 simian 的支持,simian是一個支持代碼類似度檢查的工具,目前有maven插件,也有checkstyle的插件。它不只能夠檢查java,甚至能夠支持文本文件的檢查。詳細幫助信息參考[這裏|http://www.redhillconsulting.com.au/products/simian/]。simian 的 maven插件在[這裏|http://mojo.codehaus.org/simian-report-maven-plugin/introduction.html]

{code:xml}
      <build>
         <plugins>
            <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>simian-maven-plugin</artifactId>
               <version>1.6.1</version>
            </plugin>
         </plugins>
         ...
      </build>
{code}

加入 jdepend 檢查,詳細配置參考[jdepend使用說明|http://mojo.codehaus.org/jdepend-maven-plugin/],

{code:xml}
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jdepend-maven-plugin</artifactId>
        <version>2.0-beta-2</version>
      </plugin>
{code}

加入 findbugz 檢查,詳細配置參考[findbugz使用說明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],

{code:xml}
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <version>2.0.1</version>
      </plugin>
{code}

加入javadoc生成,詳細配置參考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]

{code:xml}
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          ...
        </configuration>
      </plugin>
{code}

加入 jxr 支持,JXR是一個生成java代碼交叉引用和源代碼的html格式的工具,詳細配置信息參考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr沒有必要在build階段運行。

{code:xml}
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jxr-plugin</artifactId>
        <version>2.1</version>
      </plugin>
    </plugins>
  </reporting>
{code}

加入 Cobertura 支持,它是一個代碼覆蓋率工具,能夠用來評估具備相應測試的源代碼的比率。詳細幫助在[這裏|http://mojo.codehaus.org/cobertura-maven-plugin/index.html]。另一個功能類似的軟件是[EMMA|http://emma.sourceforge.net/samples.html],詳細的幫助在[這裏|http://mojo.codehaus.org/emma-maven-plugin/usage.html]。兩個產品的比較文章在[這裏|http://www.topcoder.com/tc?module=Static&d1=features&d2=030107],我的傾向於都要用,由於給出的指標不同,都有參考做用。

{code:xml|title=Cobertura }
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <check>
            <branchRate>85</branchRate>
            <lineRate>85</lineRate>
            <haltOnFailure>true</haltOnFailure>
            <totalBranchRate>85</totalBranchRate>
            <totalLineRate>85</totalLineRate>
            <packageLineRate>85</packageLineRate>
            <packageBranchRate>85</packageBranchRate>
            <regexes>
              <regex>
                <pattern>com.example.reallyimportant.*</pattern>
                <branchRate>90</branchRate>
                <lineRate>80</lineRate>
              </regex>
              <regex>
                <pattern>com.example.boringcode.*</pattern>
                <branchRate>40</branchRate>
                <lineRate>30</lineRate>
              </regex>
            </regexes>
          </check>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>clean</goal>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
{code}
{code:xml|title=EMMA}
  <reporting>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>emma-maven-plugin</artifactId>
        <version>1.0-alpha-3-SNAPSHOT</version>
      </plugin>
      ...
    </plugins>
    ...
  </reporting>
{code}

添加 javaNCSS 插件,它是一個java代碼的度量工具,詳細參考在[這裏|http://mojo.codehaus.org/javancss-maven-plugin/]。

{code:xml}
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>javancss-maven-plugin</artifactId>
        <version>2.0-beta-2</version>
      </plugin>
    </plugins>
  </reporting>
{code}

h4. profile相關

. 問:profile可以設置爲某個變量不存在的條件下激活?

答:使用!前綴,請看示例:

{code:xml}
<activation>
        <property>
          <name>!environment.type</name>
        </property>
      </activation>
{code}

h4. 部署相關

. 問:其餘部署到服務器的方式和配置怎麼配?

答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用於配置分發管理,配置相應的產品發佈信息,主要用於發佈,在執行mvn deploy後表示要發佈的位置 *# 配置到文件系統

{code:xml}
<distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>file://${basedir}/target/deploy<url>
  <repository>
<distributionManagement>
{code}

*# 使用ssh2配置

{code:xml}
<distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>scp://sshserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
{code}

*# 使用sftp配置

{code:xml}
<distributionManagement>
  <repository>
    <id>proficio-repositoryi<d>
    <name>Proficio Repository<name>
    <url>sftp://ftpserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
{code}

*# 使用外在的ssh配置編譯擴展用於指定使用wagon外在ssh提供,用於提供你的文件到相應的遠程服務器。

{code:xml}
<distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>scpexe://sshserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon<groupId>
      <artifactId>wagon-ssh-external<artifactId>
      <version>1.0-alpha-6<version>
    <extension>
  <extensions>
<build>
{code}

*# 使用ftp配置

{code:xml}
<distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>ftp://ftpserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagongroupId>
      <artifactId>wagon-ftpartifactId>
      <version>1.0-alpha-6version>
    <extension>
  <extensions>
<build>
{code}

{panel} h4. 插件配置

. 問:我用maven輸出site,如何設置輸出爲utf8編碼?

答: 配置site插件的編碼設置

{code:xml}
...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>2.0-beta-6</version>
    <configuration>
      <outputEncoding>UTF-8</outputEncoding>
    </configuration>
  </plugin>
  ...
{code}
. 問:

答:

相關文章
相關標籤/搜索