maven用途、核心概念、用法、常用參數和命令、擴展

Trinea

本文由淺入深,主要介紹maven的用途核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)介紹、用法(Archetype意義及創建各種項目)maven常用參數和命令以及簡單故障排除、maven擴展(eclipse、cobertura、findbugs、插件開發)、maven配置

本文較長,可根據個人需要有選擇性的查看,比如先看用法再回過頭來看核心概念

 

1、maven的用途

maven是一個項目構建和管理的工具,提供了幫助管理 構建文檔報告依賴scms發佈分發的方法。可以方便的編譯代碼、進行依賴管理、管理二進制庫等等。

maven的好處在於可以將項目過程規範化、自動化、高效化以及強大的可擴展性

利用maven自身及其插件還可以獲得代碼檢查報告、單元測試覆蓋率、實現持續集成等等。

 

2、maven的核心概念介紹

2.1 Pom

pom是指project object Model。pom是一個xml,在maven2裏爲pom.xml。是maven工作的基礎,在執行task或者goal時,maven會去項目根目錄下讀取pom.xml獲得需要的配置信息

pom文件中包含了項目的信息和maven build項目所需的配置信息,通常有項目信息(如版本、成員)、項目的依賴、插件和goal、build選項等等

pom是可以繼承的,通常對於一個大型的項目或是多個module的情況,子模塊的pom需要指定父模塊的pom

 

pom文件中節點爲

Java代碼 複製代碼 收藏代碼
  1. project pom文件的頂級元素   
  2. modelVersion 所使用的object model版本,爲了確保穩定的使用,這個元素是強制性的。除非maven開發者升級模板,否則不需要修改   
  3. groupId 是項目創建團體或組織的唯一標誌符,通常是域名倒寫,如groupId  org.apache.maven.plugins就是爲所有maven插件預留的   
  4. artifactId 是項目artifact唯一的基地址名   
  5. packaging artifact打包的方式,如jar、war、ear等等。默認爲jar。這個不僅表示項目最終產生何種後綴的文件,也表示build過程使用什麼樣的<A href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings" target=_blank>lifecycle</A>。   
  6. version artifact的版本,通常能看見爲類似0.0.1-SNAPSHOT,其中SNAPSHOT表示項目開發中,爲開發版本   
  7. name 表示項目的展現名,在maven生成的文檔中使用   
  8. url表示項目的地址,在maven生成的文檔中使用   
  9. description 表示項目的描述,在maven生成的文檔中使用   
  10. dependencies 表示依賴,在子節點dependencies中添加具體依賴的groupId artifactId和version   
  11. build 表示build配置   
  12. parent 表示父pom  
project pom文件的頂級元素
modelVersion 所使用的object model版本,爲了確保穩定的使用,這個元素是強制性的。除非maven開發者升級模板,否則不需要修改
groupId 是項目創建團體或組織的唯一標誌符,通常是域名倒寫,如groupId  org.apache.maven.plugins就是爲所有maven插件預留的
artifactId 是項目artifact唯一的基地址名
packaging artifact打包的方式,如jar、war、ear等等。默認爲jar。這個不僅表示項目最終產生何種後綴的文件,也表示build過程使用什麼樣的lifecycle。
version artifact的版本,通常能看見爲類似0.0.1-SNAPSHOT,其中SNAPSHOT表示項目開發中,爲開發版本
name 表示項目的展現名,在maven生成的文檔中使用
url表示項目的地址,在maven生成的文檔中使用
description 表示項目的描述,在maven生成的文檔中使用
dependencies 表示依賴,在子節點dependencies中添加具體依賴的groupId artifactId和version
build 表示build配置
parent 表示父pom

其中groupId:artifactId:version唯一確定了一個artifact

 

2.2 Artifact

這個有點不好解釋,大致說就是一個項目將要產生的文件,可以是jar文件,源文件,二進制文件,war文件,甚至是pom文件。每個artifact都由groupId:artifactId:version組成的標識符唯一識別。需要被使用(依賴)的artifact都要放在倉庫(見Repository)中

 

2.3 Repositories

Repositories是用來存儲Artifact的。如果說我們的項目產生的Artifact是一個個小工具,那麼Repositories就是一個倉庫,裏面有我們自己創建的工具,也可以儲存別人造的工具,我們在項目中需要使用某種工具時,在pom中聲明dependency,編譯代碼時就會根據dependency去下載工具(Artifact,供自己使用。

對於自己的項目完成後可以通過mvn install命令將項目放到倉庫(Repositories)中

倉庫分爲本地倉庫和遠程倉庫,遠程倉庫是指遠程服務器上用於存儲Artifact的倉庫,本地倉庫是指本機存儲Artifact的倉庫,對於windows機器本地倉庫地址爲系統用戶的.m2/repository下面。

對於需要的依賴,在pom中添加dependency即可,可以在maven的倉庫中搜索:http://mvnrepository.com/

 

2.4 Build Lifecycle

是指一個項目build的過程。maven的Build Lifecycle分爲三種,分別爲default(處理項目的部署)、clean(處理項目的清理)、site(處理項目的文檔生成)。他們都包含不同的lifecycle

Build Lifecycle是由phases構成的,下面重點介紹default Build Lifecycle幾個重要的phase

Xml代碼 複製代碼 收藏代碼
  1. validate 驗證項目是否正確以及必須的信息是否可用   
  2. compile 編譯源代碼   
  3. test 測試編譯後的代碼,即執行單元測試代碼   
  4. package 打包編譯後的代碼,在target目錄下生成package文件   
  5. integration-test 處理package以便需要時可以部署到集成測試環境   
  6. verify 檢驗package是否有效並且達到質量標準   
  7. install 安裝package到本地倉庫,方便本地其它項目使用   
  8. deploy 部署,拷貝最終的package到遠程倉庫和替他開發這或項目共享,在集成或發佈環境完成<SPAN style="BACKGROUND-COLOR: #ffffff; WHITE-SPACE: normal"> </SPAN>  
validate 驗證項目是否正確以及必須的信息是否可用
compile 編譯源代碼
test 測試編譯後的代碼,即執行單元測試代碼
package 打包編譯後的代碼,在target目錄下生成package文件
integration-test 處理package以便需要時可以部署到集成測試環境
verify 檢驗package是否有效並且達到質量標準
install 安裝package到本地倉庫,方便本地其它項目使用
deploy 部署,拷貝最終的package到遠程倉庫和替他開發這或項目共享,在集成或發佈環境完成 

以上的phase是有序的(注意實際兩個相鄰phase之間還有其他phase被省略,完整phase見lifecycle),下面一個phase的執行必須在上一個phase完成後

若直接以某一個phase爲goal,將先執行完它之前的phase,如mvn install

將會先validate、compile、test、package、integration-test、verify最後再執行install phase

 

2.5 Goal

goal代表一個特定任務

Xml代碼 複製代碼 收藏代碼
  1. A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.  
A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.

mvn package表示打包的任務,通過上面的介紹我們知道,這個任務的執行會先執行package phase之前的phase

mvn deploy表示部署的任務

mven clean install則表示先執行clean的phase(包含其他子phase),再執行install的phase。

 

3、maven用法

主要講下Archetype以及幾種常用項目的創建

maven創建項目是根據Archetype(原型)創建的。下面先介紹下Archetype

3.1 Archetype

原型對於項目的作用就相當於模具對於工具的作用,我們想做一個錘子,將鐵水倒入模具成型後,稍加修改就可以了。

類似我們可以根據項目類型的需要使用不同的Archetype創建項目。通過Archetype我們可以快速標準的創建項目。利用Archetype創建完項目後都有標準的文件夾目錄結構

既然Archetype相當於模具,那麼當然可以自己再造模具了啊,創建Archetype

下面介紹利用maven自帶的集中Archetype創建項目。創建項目的goal爲mvn archetype:generate,並且指定archetypeArtifactId,其中archetypeArtifactId見maven自帶的archetypeArtifactId

 

3.2 quick start工程

創建一個簡單的quick start項目,指定 -DarchetypeArtifactId爲maven-archetype-quickstart,如下命令

Xml代碼 複製代碼 收藏代碼
  1. mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false  
mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,

DinteractiveMode表示是否使用交互模式,交互模式會讓用戶填寫版本信息之類的,非交互模式採用默認值

這樣我們便建好了一個簡單的maven項目,目錄結構如下:


現在我們可以利用2.4的build Lifecycle進行一些操作,先命令行到工程根目錄下

編譯 mvn  compile

打包 mvn package,此時target目錄下會出現maven-quickstart-1.0-SNAPSHOT.jar文件,即爲打包後文件

打包並安裝到本地倉庫mvn install,此時本機倉庫會新增maven-quickstart-1.0-SNAPSHOT.jar文件。

 

3.3 web工程

創建一個簡單的web項目,只需要修 -DarchetypeArtifactId爲maven-archetype-webapp即可,如下命令

Java代碼 複製代碼 收藏代碼
  1. mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false  
mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

 

其他:

src\main\resources文件夾是用來存放資源文件的,maven工程默認沒有resources文件夾,如果我們需要用到類似log4j.properties這樣的配置文件,就需要在src\main文件夾下新建resources文件夾,並將log4j.properties放入其中。

test需要用到資源文件,類似放到src\test下

對於apache的log4j沒有log4j.properties文件或是目錄錯誤,會報如下異常

Xml代碼 複製代碼 收藏代碼
  1. log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).   
  2. log4j:WARN Please initialize the log4j system properly.  
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.

 

4、maven常用參數和命令

主要介紹maven常用參數和命令以及簡單故障排除

 

4.1 mvn常用參數

mvn -e 顯示詳細錯誤

mvn -U 強制更新snapshot類型的插件或依賴庫(否則maven一天只會更新一次snapshot依賴)

mvn -o 運行offline模式,不聯網更新依賴

mvn -N僅在當前項目模塊執行命令,關閉reactor

mvn -pl module_name在指定模塊上執行命令

mvn -ff 在遞歸執行命令過程中,一旦發生錯誤就直接退出

mvn -Dxxx=yyy指定java全局屬性

mvn -Pxxx引用profile xxx

 

4.2 首先是2.4 Build Lifecycle中介紹的命令

mvn test-compile 編譯測試代碼

mvn test 運行程序中的單元測試

 

mvn  compile 編譯項目

mvn package 打包,此時target目錄下會出現maven-quickstart-1.0-SNAPSHOT.jar文件,即爲打包後文件

mvn install 打包並安裝到本地倉庫,此時本機倉庫會新增maven-quickstart-1.0-SNAPSHOT.jar文件。

每個phase都可以作爲goal,也可以聯合,如之前介紹的mvn clean install

 

 

4.3 maven 日用三板斧

mvn archetype:generate 創建maven項目

mvn package 打包,上面已經介紹過了

mvn package -Prelease打包,並生成部署用的包,比如deploy/*.tgz

mvn install 打包並安裝到本地庫

mvn eclipse:eclipse 生成eclipse項目文件

mvn eclipse:clean 清除eclipse項目文件

mvn site 生成項目相關信息的網站

 

4.4 maven插件常用參數

mvn -Dwtpversion=2.0 指定maven版本

mvn -Dmaven.test.skip=true 如果命令包含了test phase,則忽略單元測試

mvn -DuserProp=filePath 指定用戶自定義配置文件位置

mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse項目文件,嘗試從倉庫下載源代碼,並且生成的項目包含模塊版本(注意如果使用公用POM,上述的開關缺省已打開)

 

4.5 maven簡單故障排除

 

mvn -Dsurefire.useFile=false如果執行單元測試出錯,用該命令可以在console輸出失敗的單元測試及相關信息

set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m 調大jvm內存和持久代,maven/jvm out of memory error

mvn -X maven log level設定爲debug在運行

mvndebug 運行jpda允許remote debug

mvn --help 這個就不說了。。

 

5、maven擴展

maven常用插件配置和使用

 

6、maven配置

爲了修改maven創建項目默認以來的jdk版本,看了下maven配置,可參考http://www.iteye.com/topic/41612

maven2.0默認使用jdk1.5導致反省、@override 等annotation不可用。可用兩種方法修改jdk版本

第一種:修改項目的pom.xml,影響單個項目,治標不治本

Java代碼 複製代碼 收藏代碼
  1. <build>   
  2.     <plugins>   
  3.         <plugin>   
  4.             <groupId>org.apache.maven.plugins</groupId>   
  5.             <artifactId>maven-compiler-plugin</artifactId>   
  6.             <configuration>   
  7.                 <source>1.6</source>   
  8.                 <target>1.6</target>   
  9.                 <encoding>UTF-8</encoding>   
  10.             </configuration>   
  11.         </plugin>   
  12.     </plugins>   
  13. </build>  
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

pom中增加build配置,指定java版本爲1.6

 

第二種:修改maven配置,影響maven建立的所有項目

到maven安裝目錄的conf文件夾下,修改settings.xml文件,如下:

Java代碼 複製代碼 收藏代碼
  1. <profiles>      
  2.        <profile>        
  3.             <id>jdk-1.6</id>        
  4.             <activation>        
  5.                 <activeByDefault>true</activeByDefault>        
  6.                 <jdk>1.6</jdk>        
  7.             </activation>        
  8.             <properties>        
  9.                 <maven.compiler.source>1.6</maven.compiler.source>        
  10.                 <maven.compiler.target>1.6</maven.compiler.target>        
  11.                 <maven.compiler.compilerVersion>1.6</maven.compiler.compilerVersion>        
  12.             </properties>        
  13.     </profile>       
  14. </profiles>   
<profiles>   
       <profile>     
            <id>jdk-1.6</id>     
            <activation>     
                <activeByDefault>true</activeByDefault>     
                <jdk>1.6</jdk>     
            </activation>     
            <properties>     
                <maven.compiler.source>1.6</maven.compiler.source>     
                <maven.compiler.target>1.6</maven.compiler.target>     
                <maven.compiler.compilerVersion>1.6</maven.compiler.compilerVersion>     
            </properties>     
    </profile>    
</profiles> 

這樣便能對所有默認的maven項目指定jdk爲1.6

 

 

到此爲止,休息會兒

 

參考資料:

Maven官方文檔:http://maven.apache.org/guides/index.html

Maven權威指南:http://www.sonatype.com/books/maven-book/reference_zh/public-book.html

maven安裝:http://maven.apache.org/download.html

http://www.infoq.com/cn/search.action?queryString=maven%E5%AE%9E%E6%88%98&searchOrder=relevance&search=maven%E5%AE%9E%E6%88%98

發佈了41 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章