《maven權威指南》學習筆記(更新中)

轉自:http://macrochen.javaeye.com/blog/357308
html


maven=構建工具+依賴管理+項目生命週期管理 
什麼是maven插件的目標? 
maven插件至關於一個功能集合, 而目標就是這個功能集合中的一個子功能(任務), 好比help:effective-pom中help就是一個插件, effective-pom就是help插件的一個目標, 用來顯示pom文件 

help:describe幾個比較有用的用法 
查看一個插件的描述信息 
如, mvn help:describe -Dplugin=help查看help插件的信息 
查看一個插件的詳細描述信息 
如, mvn help:describe -Dplugin=help -Dfull 
查看一個插件的一個指定目標的描述信息 
如, mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull, 這裏的mojo就是目標的意思 

什麼是maven的生命週期? 
maven的聲明週期是隻在構建一個項目過程當中的有序階段, 這些階段包括, process-resource, compile, process-classes, process-test-resources, test-compile, test, prepare-package, package, 生命週期的階段是有序的, 當執行指定的生命週期的時候, 其前面的階段也會依次被執行 

插件目標和生命週期之間的關係 
插件目標能夠附着在生命週期階段上, 隨着生命週期的移動, 附着在不一樣階段上的插件目標會被執行, 好比運行package的時候, 可能jar:jar會被執行了, 因此生命週期能夠當作執行多個不一樣插件目標的一個集合 

maven能夠當作項目管理的一個容器和框架, 他本身自己不知道如何構建, 管理項目, 這個功能是經過插件來處理的, 而這些插件就放在maven倉庫中, 當調用maven的相關命令的時候, maven的客戶端(maven-bin)會從maven倉庫中下載相應的插件到本地, 而後執行相應的動做.maven倉庫中除了maven插件外還放有依賴的第三方庫, 這樣實現了兩者能在不一樣的項目中被重用 

maven的項目模型 
maven的項目模型是用來描述項目的結構, 開發貢獻者, 使用的開放協議, 所依賴的包, 所使用的插件等相關信息的描述定義, 對於項目信息的描述, 不一樣的開發工具(eclipse, netbeans, intelliJ)須要不一樣的項目配置文件, maven能夠根據不一樣的項目開發工具生成相應的項目配置文件 

最經常使用到的插件 
archetype插件是用來生成項目的原型(骨架)用的,他各類的目標, 用來生成不一樣的項目骨架, 最簡單的目標是create, 用來生成一個普通的java項目, 建立一個項目骨架須要一些參數 
artifactId, 是項目名 
packageName是項目的包結構 
groupId是最終將這個項目打包並放到maven倉庫(install)中的座標路徑 

在任何一個pom文件中, 都會存在artifactId, groupId, packaging, version這樣幾個元素, 這些元素是用來幫助其餘應用定位該應用使用的, 也就是指明該應用若是放到maven倉庫中的位置, 其餘的應用若是要依賴它, 應該如何配置才能找到它. 

一些有用的maven插件介紹: 
mvn dependency:resolve 這個插件目標是用來查看當前的項目的依賴狀況 
mvn dependency:tree 用來顯示依賴關係的 

與測試相關 
一般,你會開發一個帶有不少失敗單元測試的系統。 若是你正在實踐測試驅動開發(TDD),你可能會使用測試失敗來衡量你離項目完成有多遠。 若是你有失敗的單元測試,但你仍然但願產生構建輸出,你就必須告訴 Maven 讓它忽略測試失敗。 當 Maven 遇到一個測試失敗,它默認的行爲是中止當前的構建。 若是你但願繼續構建項目,即便 Surefire 插件遇到了失敗的單元測試,你就須要設置 Surefire 的 testFailureIgnore 這個配置屬性爲 true。 
也能夠經過mven 參數來指定: 
mvn test -Dmaven.test.failure.ignore=true 
設置插件配置:java

Xml代碼
  1. < plugin >   
  2.   < groupId > org.apache.maven.plugins </ groupId >   
  3.   < artifactId > maven-surefire-plugin </ artifactId >   
  4.   < configuration >   
  5.     < testFailureIgnore > true </ testFailureIgnore >   
  6.   </ configuration >   
  7. </ plugin >   



你可能想要配置 Maven 使其徹底跳過單元測試。 可能你有一個很大的系統,單元測試須要花好多分鐘來完成,而你不想在生成最終輸出前等單元測試完成。 你可能正工做在一個遺留系統上面,這個系統有一系列的失敗的單元測試,你可能僅僅想要生成一個 JAR  而不是去修復全部的單元測試。 Maven 提供了跳過單元測試的能力,只須要使用 Surefire 插件的 skip 參數。 在命令行,只要簡單的給任何目標添加 maven.test.skip 屬性就能跳過測試: 
mvn install -Dmaven.test.skip=true 
還有一種是修改插件配置:mysql

Xml代碼
  1. < plugin >   
  2.         < groupId > org.apache.maven.plugins </ groupId >   
  3.         < artifactId > maven-surefire-plugin </ artifactId >   
  4.         < configuration >   
  5.           < skip > true </ skip >   
  6.         </ configuration >   
  7.       </ plugin >   


Maven Assembly 插件是一個用來建立你應用程序特有分發包的插件。 你可使用 Maven Assembly 插件以你但願的任何形式來裝配輸出,只需定義一個自定義的裝配描述符。 後面的章節咱們會說明如何建立一個自定義裝配描述符,爲 Simple Weather 應用程序生成一個更復雜的存檔文件。 本章咱們將會使用預約義的 jar-with-dependencies 格式。配置以下:spring

Xml代碼
  1. < plugin >   
  2.   < artifactId > maven-assembly-plugin </ artifactId >   
  3.   < configuration >   
  4.     < descriptorRefs >   
  5.       < descriptorRef > jar-with-dependencies </ descriptorRef >   
  6.     </ descriptorRefs >   
  7.   </ configuration >   
  8. </ plugin >   


多模塊 
在使用多模塊的時候, 父模塊的打包類型必須爲pom 
子模塊的pom不須要設置groupId和version, 它直接公用了父模塊的groupId和version 
當Maven執行一個帶有子模塊的項目的時候,Maven首先載入父POM,而後定位全部的子模塊POM。Maven而後將全部這些項目的POM 放入到一個稱爲Maven 反應堆(Reactor)的東西中,由它負責分析模塊之間的依賴關係。這個反應堆處理組件的排序,以確保相互獨立的模塊能以適當的順序被編譯和安裝。 

pom的優化 
在多模塊開發過程當中, 針對依賴管理, 最重要的措施就是減小依賴配置的重複, 也就是將相同的依賴都提到parent層上, 而版本的重複能夠經過定義property來處理, 好比:sql

Xml代碼
  1. < properties >   
  2.   < hibernate.annotations.version > 3.3.0.ga </ hibernate.annotations.version >   
  3. </ properties >   


依賴的重複經過dependencyManagement來解決.好比:shell

Xml代碼
  1. < dependencyManagement >   
  2.     < dependencies >   
  3.       < dependency >   
  4.         < groupId > org.springframework </ groupId >   
  5.         < artifactId > spring </ artifactId >   
  6.         < version > 2.0.7 </ version >   
  7.       </ dependency >   


插件也存在去重的問題, 如同依賴同樣處理 

dependency:analyze能夠幫助咱們分析項目中的依賴狀況, 找出那些未使用的依賴, 取消那些間接依賴 

老是爲你代碼引用的類顯式聲明依賴, 幫助分析依賴層次能夠藉助maven提供的插件: 
dependency:analyze 用於分析項目的依賴狀況, 那些是顯示依賴, 那些是隱式依賴(依賴的依賴) 
dependency:tree能夠用層次的格式顯示依賴之間的關係 

pom詳解 
pom的默認完整配置在${M2_HOME}/lib中的maven-2.0.9-uber.jar文件中能夠找到。若是你看一下這個JAR文件,你會看到在包org.apache.maven.project下看到一個名爲pom-4.0.0.xml的文件。 
mvn help:effective-pom 能夠幫忙顯示默認超級pom和父級pom以及當前pom合併以後的最終pom結構 

版本的問題 
pom中項目版本格式: 
<major version>.<minor version>.<incremental version>-<qualifier>, 如:1.3.5-beta-01 

Maven版本能夠包含一個字符串字面量來表示項目正處於活動的開發狀態。若是一個版本包含字符串「SNAPSHOT」,Maven就會在安裝或 發佈這個組件的時候將該符號展開爲一個日期和時間值,轉換爲UTC(協調世界時)。例如,若是你的項目有個版本爲「1.0-SNAPSHOT」而且你將這 個項目的構件部署到了一個Maven倉庫,若是你在UTC2008年2月7號下午11:08部署了這個版本,Maven就會將這個版本展開成 「1.0-20080207-230803-1」。換句話說,當你發佈一個snapshot,你沒有發佈一個軟件模塊,你只是發佈了一個特定時間的快照版 本。 若是一個項目依賴於SNAPSHOT,那麼這個依賴很不穩定,它隨時可能變化。發佈到非snapshot的Maven倉庫(如 http://repo1.maven.org/maven2)的構件不能依賴於任何SNAPSHOT版本,由於Maven的超級POM對於中央倉庫關閉 了snapshot。SNAPSHOT版本只用於開發過程。 

LATEST是指某個特定構件最新的發佈版或者快照版(snapshot),最近被部署到某個特定倉庫的構件。RELEASE是指倉庫中最後的一 個非快照版本。總得來講,設計軟件去依賴於一個構件的不明確的版本,並非一個好的實踐。若是你處於軟件開發過程當中,你可能想要使用RELEASE或者 LATEST,這麼作十分方便,你也不用爲每次一個第三方類庫新版本的發佈而去更新你配置的版本號。但當你發佈軟件的時候,你老是應該肯定你的項目依賴於 某個特定的版本,以減小構建的不肯定性,省得被其它不受你控制的軟件版本影響。若是不管如何你都要使用LATEST和RELEASE,那麼要當心使用。 

Maven提供了三個隱式的變量 
env:引用操做系統或者shell的環境變量 
project:當前的pom, 好比要引用當前pom的artifactId, 能夠這樣寫:org.sonatype.mavenbook-${project.artifactId} 
settings:maven的settings信息, 可使用點標記(.)的路徑來引用settings.xml文件中元素的值。例如,${settings.offline}會引用~/.m2/settings.xml文件中offline元素的值。 

maven依賴範圍 
compile是默認的範圍 
provided依賴只有在當JDK或者一個容器已提供該依賴以後才使用。如servlet依賴 
untime依賴在運行和測試系統的時候須要,但在編譯的時候不須要。如jdbc驅動依賴 
test範圍依賴 在通常的 編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。 
system範圍依賴極少用 

可選依賴 
如 my-project的依賴的緩存有兩種實現(ehcache and swarmcache)這樣設置:apache

Xml代碼
  1. < dependency >   
  2.   < groupId > net.sf.ehcache </ groupId >   
  3.   < artifactId > ehcache </ artifactId >   
  4.   < version > 1.4.1 </ version >   
  5.   < optional > true </ optional >   
  6. </ dependency >   
  7. < dependency >   
  8.   < groupId > swarmcache </ groupId >   
  9.   < artifactId > swarmcache </ artifactId >   
  10.   < version > 1.0RC2 </ version >   
  11.   < optional > true </ optional >   
  12. </ dependency >   


還有一種解決方式是, 你能夠將EHCache相關的代碼放到my-project-ehcache子模塊中,將SwarmCache相關的代碼放到my-project- swarmcache子模塊中,而非建立一個帶有一系列可選依賴的大項目。這樣,其它項目就能夠只引用特定實現的項目,發揮傳遞性依賴的功效,而不用去引 用my-project項目,再本身聲明特定的依賴。 

依賴版本的限制 
(表示不包括, [表示包括, 據個例子, 依賴的junit版本大於等於3.8但小於4.0, 能夠這樣寫:緩存

Xml代碼
  1. < dependency >   
  2.   < groupId > junit </ groupId >   
  3.   < artifactId > junit </ artifactId >   
  4.   < version > [3.8,4.0) </ version >   
  5.   < scope > test </ scope >   
  6. </ dependency >   


想要依賴JUnit任意的不大於3.8.1的版本, 能夠這樣寫:框架

Xml代碼
  1. < dependency >   
  2.   < groupId > junit </ groupId >   
  3.   < artifactId > junit </ artifactId >   
  4.   < version > [,3.8.1] </ version > ex-de  
  5.   < scope > test </ scope >   
  6. </ dependency >   


在逗號前面或者後面的版本不是必須的,這種空缺意味着正無窮或者負無窮。例如,「[4.0,)」意思是任何大於等於4.0的版本,「(,2.0)」意思是任意小於2.0的版本。「[1.2]」意思是隻有版本1.2,沒有其它。 
當聲明一個「正常的」版本如JUnit 3.8.2,內部它其實被表述成「容許任何版本,但最好是3.8.2」。若是你指定[3.8.2],它意味只有3.8.2會被使用,沒有其它。若是其它什 麼地方有一個版本指定了[3.8.1],你會獲得一個構建失敗報告,告訴你有版本衝突。 

排除傳遞性依賴 
添加了一個對於project-a的依賴,project-a對project-b有依賴, 但排除了傳遞性依賴project-b, 能夠這樣寫:eclipse

Xml代碼
  1. < dependency >   
  2.   < groupId > org.sonatype.mavenbook </ groupId >   
  3.   < artifactId > project-a </ artifactId >   
  4.   < version > 1.0 </ version >   
  5.   < exclusions >   
  6.     < exclusion >   
  7.       < groupId > org.sonatype.mavenbook </ groupId >   
  8.       < artifactId > project-b </ artifactId >   
  9.     </ exclusion >   
  10.   </ exclusions >   
  11. </ dependency >   


一個實際的例子是Hibernate依賴於Sun JTA  API,然後者在中央Maven倉庫中不可用,由於它是不能免費分發的。Apache Gernoimo項目建立了一些能夠免費分發的獨立實現類庫。爲了用另外的依賴來替換這個傳遞性依賴,你須要排除這個傳遞性以依賴,而後在你的項目中再聲 明一個依賴。

Xml代碼
  1. < dependencies >   
  2.   < dependency >   
  3.     < groupId > org.hibernate </ groupId >   
  4.     < artifactId > hibernate </ artifactId >   
  5.     < version > 3.2.5.ga </ version >   
  6.     < exclusions >   
  7.       < exclusion >   
  8.         < groupId > javax.transaction </ groupId >   
  9.         < artifactId > jta </ artifactId >   
  10.       </ exclusion >   
  11.     </ exclusions >   
  12.   </ dependency >   
  13.   < dependency >   
  14.     < groupId > org.apache.geronimo.specs </ groupId >   
  15.     < artifactId > geronimo-jta_1.1_spec </ artifactId >   
  16.     < version > 1.1 </ version >   
  17.   </ dependency >   
  18. </ dependencies >   


可能想要排除或者替換傳遞性依賴的狀況: 
構建的groupId和artifactId已經更改了,而當前的項目須要一個與傳遞性依賴不一樣名稱的版本——結果是classpath中出現了一樣項目的兩分內容。 
某個構件沒有在你的項目中被使用,並且該傳遞性依賴沒有被標誌爲可選依賴。 
一個構件已經在運行時的容器中提供了,所以不該該被包含在你的構件中。 
爲了排除一個多是多個實現的API的依賴。 

依賴的繼承 
maven中的依賴繼承有兩種狀況, 一種就是在父maven項目中經過dependencies中定義公共依賴項, 這樣定義以後, 全部子類都會增長該依賴項, 不論是否有依賴, 另外一種就是在父maven項目中經過dependenciesManagement中定義公共依賴項, 而後子項目中增長依賴項, 只是不須要增長版本號, 除非版本與父項目中定義的不一致.這樣只有在子項目中添加了依賴項, 依賴纔會引入, 這樣作的好處就是能夠在父maven項目中統一管理版本號. 

多模塊項目 
模塊項目的打包類型爲pom, 模塊項目下面還能夠有模塊項目. 

項目繼承 
當一個項目指定一個父項目的時候,Maven在讀取當前項目的POM以前,會使用這個父POM做爲起始點。它繼承全部東西,包括groupId和 version。你會注意到project-a沒有指定groupId和version,它們從a-parent繼承而來。有了parent元素,一個 POM就只須要定義一個artifactId。但這不是強制的,project-a能夠有一個不一樣的groupId和version,但若是不提供 值,Maven就會使用在父POM中指定的值。 
Maven假設父POM在本地倉庫中可用,或者在當前項目的父目錄(../pom.xml) 中可用。若是兩個位置都不可用,默認行爲還能夠經過relativePath元素被覆蓋。例如,一些組織更喜歡一個平坦的項目結構,父項目的 pom.xml並不在子項目的父目錄中。它可能在項目的兄弟目錄中。若是你的子項目在目錄./project-a中,父項目在名爲./a-parent的 目錄中,你可使用以下的配置來指定parent-a的POM的相對位置。

Xml代碼
  1. < project >   
  2.   < parent >   
  3.     < groupId > org.sonatype.mavenbook </ groupId >   
  4.     < artifactId > a-parent </ artifactId >   
  5.     < version > 1.0-SNAPSHOT </ version >   
  6.     < relativePath > ../a-parent/pom.xml </ relativePath >   
  7.   </ parent >   
  8.   < artifactId > project-a </ artifactId >   
  9. </ project >   



POM最佳實踐 
依賴歸類 
將一組公共的依賴, 以pom的方式打包(這個就是所謂的依賴歸類), 不過這個包只存在本地maven倉庫, 對多人共享依賴就失去了意義, 而後在須要這組公共依賴包的地方引入, 好比多個項目同時對hb, spring, mysql驅動有依賴, 這能夠這樣定義(注意屬性的寫法):

Xml代碼
  1. < project >   
  2.   < groupId > org.sonatype.mavenbook </ groupId >   
  3.   < artifactId > persistence-deps </ artifactId >   
  4.   < version > 1.0 </ version >   
  5.   < packaging > pom </ packaging >   
  6.   < dependencies >   
  7.     < dependency >   
  8.       < groupId > org.hibernate </ groupId >   
  9.       < artifactId > hibernate </ artifactId >   
  10.       < version > ${hibernateVersion} </ version >   
  11.     </ dependency >   
  12.     < dependency >   
  13.       < groupId > org.hibernate </ groupId >   
  14.       < artifactId > hibernate-annotations </ artifactId >   
  15.       < version > ${hibernateAnnotationsVersion} </ version >   
  16.     </ dependency >   
  17.     < dependency >   
  18.       < groupId > org.springframework </ groupId >   
  19.       < artifactId > spring-hibernate3 </ artifactId >   
  20.       < version > ${springVersion} </ version >   
  21.     </ dependency >   
  22.     < dependency >   
  23.       < groupId > mysql </ groupId >   
  24.       < artifactId > mysql-connector-java </ artifactId >   
  25.       < version > ${mysqlVersion} </ version >   
  26.     </ dependency >   
  27.   </ dependencies >   
  28.   < properties >   
  29.     < mysqlVersion > (5.1,) </ mysqlVersion >   
  30.     < springVersion > (2.0.6,) </ springVersion >   
  31.     < hibernateVersion > 3.2.5.ga </ hibernateVersion >   
  32.     < hibernateAnnotationsVersion > 3.3.0.ga </ hibernateAnnotationsVersion >   
  33.   </ properties >   
  34. </ project >   


在須要依賴, 這樣寫:

Xml代碼
  1. < project >   
  2.   < description > This is a project requiring JDBC </ description >   
  3.   ...  
  4.   < dependencies >   
  5.     ...  
  6.     < dependency >   
  7.       < groupId > org.sonatype.mavenbook </ groupId >   
  8.       < artifactId > persistence-deps </ artifactId >   
  9.       < version > 1.0 </ version >   
  10.       < type > pom </ type >   
  11.     </ dependency >   
  12.   </ dependencies >   
  13. </ project >   



多模塊 vs. 繼承 
沒看懂 

Maven中有三種標準的生命週期:清理(clean),默認(default)(有時候也稱爲構建),和站點(site) 
清理生命週期 (clean)包括三個階段:pre-clean, clean, post-clean 
在pre-clean中執行一個ant任務, 能夠這樣寫:

Xml代碼
  1. < build >   
  2.     < plugins > ...  < plugin >   
  3.     < artifactId > maven-antrun-plugin </ artifactId >   
  4.     < executions >   
  5.       < execution >   
  6.         < id > file-exists </ id >   
  7.         < phase > pre-clean </ phase >   
  8.         < goals >   
  9.           < goal > run </ goal >   
  10.         </ goals >   
  11.         < configuration >   
  12.           < tasks >   
  13.             <!-- adds the ant-contrib tasks (if/then/else used below) -->   
  14.             < taskdef   resource = "net/sf/antcontrib/antcontrib.properties"   />   
  15.             < available    
  16.               file = "/data/hudson-temporal-data/hudson-orchestrator-home/workspace/Book-To-Production/book/content-zh/target/book.jar"   
  17.               property = "file.exists"   value = "true"   />   
  18.   
  19.             < if >   
  20.               < not >   
  21.                 < isset   property = "file.exists"   />   
  22.               </ not >   
  23.               < then >   
  24.                 < echo > No  
  25.                   book.jar to  
  26.                   delete</ echo >   
  27.               </ then >   
  28.               < else >   
  29.                 < echo > Deleting  
  30.                   book.jar</ echo >   
  31.               </ else >   
  32.             </ if >   
  33.           </ tasks >   
  34.         </ configuration >   
  35.       </ execution >   
  36.     </ executions >   
  37.     < dependencies >   
  38.       < dependency >   
  39.         < groupId > ant-contrib </ groupId >   
  40.         < artifactId > ant-contrib </ artifactId >   
  41.         < version > 1.0b2 </ version >   
  42.       </ dependency >   
  43.     </ dependencies >   
  44.   </ plugin >   
  45.   </ plugins >   
  46.   </ build >   


還能夠對clean階段進行定製, 好比刪除指定目錄中的東東, 這個須要在maven-clean-plugin中作一些手腳, 能夠這樣寫:

Xml代碼
  1. < build >   
  2.     < plugins >   
  3.       < plugin >   
  4.         < artifactId > maven-clean-plugin </ artifactId >   
  5.         < configuration >   
  6.           < filesets >   
  7.             < fileset >   
  8.               < directory > target-other </ directory >   
  9.               < includes >   
  10.                 < include > *.class </ include >   
  11.               </ includes >   
  12.             </ fileset >   
  13.           </ filesets >   
  14.         </ configuration >   
  15.       </ plugin >   
  16.     </ plugins >   
  17.   </ build >   


默認生命週期從編譯, 測試, 打包到部署的過程 
站點生命週期 (site)是一個生成報告站點的過程 
不一樣的打包類型, 有不一樣的生命週期, 並且不一樣的生命週期階段會綁定不一樣的插件目標. 

生命週期階段介紹 
Process Resources階段 
該階段會綁定resources:resources插件目標, 它用來將resource從src下copy到target下 
在資源文件中使用過濾替換, 用例子最好懂, 
有這樣的資源文件:

Xml代碼
  1. < service >   
  2.   <!-- This URL was set by project version 0.23 -->   
  3.   < url > ${jdbc.url} </ url >   
  4.   < user > ${jdbc.username} </ user >   
  5.   < password > ${jdbc.password} </ password >   
  6. </ service >   


有個配置文件default.properties: 
jdbc.url=jdbc:hsqldb:mem:mydb 
jdbc.username=sa 
jdbc.password= 
在pom中配置和使用過濾:

Xml代碼
  1. < build >   
  2.   < filters >   
  3.     < filter > src/main/filters/default.properties </ filter >   
  4.   </ filters >   
  5.   < resources >   
  6.     < resource >   
  7.       < directory > src/main/resources </ directory >   
  8.       < filtering > true </ filtering >   
  9.     </ resource >   
  10.   </ resources >   
  11. </ build >   


默認的資源都放在src/main/resources目錄下, 你也能夠定製, 好比這裏放在src/main/xml和src/main/images:

Xml代碼
  1. < build >   
  2.   ...  
  3.   < resources >   
  4.     < resource >   
  5.       < directory > src/main/resources </ directory >   
  6.     </ resource >   
  7.     < resource >   
  8.       < directory > src/main/xml </ directory >   
  9.     </ resource >   
  10.     < resource >   
  11.       < directory > src/main/images </ directory >   
  12.     </ resource >   
  13.   </ resources >   
  14.   ...  
  15. </ build >   



compile階段 
該階段會調用compile:compile, Compiler插件調用javac,使用的source設置爲1.3,默認target設置爲1.1。換句話說,Compiler插件會假設你全部的Java源代碼遵循Java 1.3,目標爲Java 1.1 JVM。 
要更改這些設置:

Xml代碼
  1. < plugins >   
  2.       < plugin >   
  3.         < artifactId > maven-compiler-plugin </ artifactId >   
  4.         < configuration >   
  5.           < source > 1.5 </ source >   
  6.           < target > 1.5 </ target >   
  7.         </ configuration >   
  8.       </ plugin >   
  9.     </ plugins >   


這裏配置的是Compiler插件全部目標的source和class,若是咱們只要爲compile:compile目標配置source和target,就要將configuration元素放到compile:compile目標的execution元素下。 
若是你想要存儲項目的源碼至src/java而非src/main/java, 能夠這樣寫:

Xml代碼
  1. < build >   
  2.   ...  
  3.   < sourceDirectory > src/java </ sourceDirectory >   
  4.   < outputDirectory > classes </ outputDirectory >   
  5.   ...  
  6. </ build >   


若是沒有特殊的緣由, 最好不要改maven的一些默認設置. 

Test階段 
該階段默認的是綁定surefire:test. Surefire默認的行爲是尋找測試源碼目錄下全部以*Test結尾的類,以JUnit測試的形式運行它們。Surefire插件也能夠配置成運行 TestNG單元測試。 當遇到單元測試失敗的時候,默認行爲是中止構建。要覆蓋這種行爲,你須要設置Surefire插件的testFailureIgnore配置屬性爲 true。

Xml代碼
  1. < plugin >   
  2.       < groupId > org.apache.maven.plugins </ groupId >   
  3.       < artifactId > maven-surefire-plugin </ artifactId >   
  4.      < configuration >   
  5.        < testFailureIgnore > true </ testFailureIgnore >   
  6.      </ configuration >   
  7.     </ plugin >   


想要整個的跳過測試,你能夠運行以下的命令: 
mvn install -Dmaven.test.skip=true 

Install階段
 
調用install:install目標, 將項目的主要構件安裝到本地倉庫 

Deploy 階段 
調用deploye:deploye目標, 用於將一個構件部署到遠程maven倉庫 

maven屬性 
maven的模型對象是org.apache.maven.model.Model, 完整的參考:http://maven.apache.org/ref/2.0.9/maven-model/maven.html 
settings的完整參考:http://maven.apache.org/ref/2.0.9/maven-settings/settings.html 
用戶自定義屬性舉例:

Xml代碼
  1. < properties >   
  2.     < arbitrary.property.a > This is some text </ arbitrary.property.a >   
  3.     < hibernate.version > 3.3.0.ga </ hibernate.version >   
  4.   </ properties >   
  5.   ...  
  6.   < dependencies >   
  7.     < dependency >   
  8.       < groupId > org.hibernate </ groupId >   
  9.       < artifactId > hibernate </ artifactId >   
  10.       < version > ${hibernate.version} </ version >   
  11.     </ dependency >     
  12.   </ dependencies > 
相關文章
相關標籤/搜索