Maven介紹,包括作用、核心概念、用法、常用命令、擴展及配置(轉(zhuǎn))

看到一篇關(guān)門maven寫的特別好的文章,收藏一下,原文地址:http://www.trinea.cn/android/maven/

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

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

1、maven的用途

maven是一個項目構(gòu)建和管理的工具,提供了幫助管理 構(gòu)建、文檔、報告、依賴、scms、發(fā)布、分發(fā)的方法。可以方便的編譯代碼、進(jìn)行依賴管理、管理二進(jìn)制庫等等。

maven的好處在于可以將項目過程規(guī)范化、自動化、高效化以及強大的可擴展性

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

2、maven的核心概念介紹

2.1 Pom

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

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

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

pom文件中節(jié)點含義如下:

? ? ? project pom文件的頂級元素

? ? ? modelVersion所使用的objectmodel版本,為了確保穩(wěn)定的使用,這個元素是強制性的。除非maven開發(fā)者升級模板,否則不需要修改

? ? ? groupId是項目創(chuàng)建團(tuán)體或組織的唯一標(biāo)志符,通常是域名倒寫,如groupIdorg.apache.maven.plugins就是為所有maven插件預(yù)留的

? ? ? artifactId是項目artifact唯一的基地址名

? ? ? packagingartifact打包的方式,如jar、war、ear等等。默認(rèn)為jar。這個不僅表示項目最終產(chǎn)生何種后綴的文件,也表示build過程使用什么樣的 ? ? ? lifecycle。

? ? ? versionartifact的版本,通常能看見為類似0.0.1-SNAPSHOT,其中SNAPSHOT表示項目開發(fā)中,為開發(fā)版本

? ? ? name表示項目的展現(xiàn)名,在maven生成的文檔中使用

? ? ? url表示項目的地址,在maven生成的文檔中使用

? ? ? description表示項目的描述,在maven生成的文檔中使用

? ? ? dependencies表示依賴,在子節(jié)點dependencies中添加具體依賴的groupIdartifactId和version

? ? ? build表示build配置

? ? ? parent表示父pom

其中g(shù)roupId:artifactId:version唯一確定了一個artifact

2.2 Artifact

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

2.3 Repositories

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

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

倉庫分為本地倉庫和遠(yuǎn)程倉庫,遠(yuǎn)程倉庫是指遠(yuǎn)程服務(wù)器上用于存儲Artifact的倉庫,本地倉庫是指本機存儲Artifact的倉庫,對于windows機器本地倉庫地址為系統(tǒng)用戶的.m2/repository下面。

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

2.4 Build Lifecycle

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

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

? ? ? ?validate驗證項目是否正確以及必須的信息是否可用

? ? ? ?compile編譯源代碼

? ? ? ?test測試編譯后的代碼,即執(zhí)行單元測試代碼

? ? ? ?package打包編譯后的代碼,在target目錄下生成package文件

? ? ? ?integration-test處理package以便需要時可以部署到集成測試環(huán)境

? ? ? ?verify檢驗package是否有效并且達(dá)到質(zhì)量標(biāo)準(zhǔn)

? ? ? ?install安裝package到本地倉庫,方便本地其它項目使用

? ? ? ?deploy部署,拷貝最終的package到遠(yuǎn)程倉庫和替他開發(fā)這或項目共享,在集成或發(fā)布環(huán)境 ? ? ? ?完成

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

若直接以某一個phase為goal,將先執(zhí)行完它之前的phase,如mvn install

將會先validate、compile、test、package、integration-test、verify最后再執(zhí)行install phase

2.5 Goal

goal代表一個特定任務(wù)

? ? ? A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.

如:

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

mvn deploy表示部署的任務(wù)

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

3、maven用法

主要講下Archetype以及幾種常用項目的創(chuàng)建

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

3.1 Archetype

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

類似我們可以根據(jù)項目類型的需要使用不同的Archetype創(chuàng)建項目。通過Archetype我們可以快速標(biāo)準(zhǔn)的創(chuàng)建項目。利用Archetype創(chuàng)建完項目后都有標(biāo)準(zhǔn)的文件夾目錄結(jié)構(gòu)

既然Archetype相當(dāng)于模具,那么當(dāng)然可以自己再造模具了啊,創(chuàng)建Archetype

下面介紹利用maven自帶的集中Archetype創(chuàng)建項目。創(chuàng)建項目的goal為mvn archetype:generate,并且指定archetypeArtifactId,其中archetypeArtifactId見maven自帶的archetypeArtifactId

3.2 quick start工程

創(chuàng)建一個簡單的quick start項目,指定 -DarchetypeArtifactId為maven-archetype-quickstart,如下命令

Xml代碼 收藏代碼

mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

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

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

這樣我們便建好了一個簡單的maven項目,目錄結(jié)構(gòu)如下:

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

編譯 mvn compile

打包 mvn package,此時target目錄下會出現(xiàn)maven-quickstart-1.0-SNAPSHOT.jar文件,即為打包后文件

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

3.3 web工程

創(chuàng)建一個簡單的web項目,只需要修 -DarchetypeArtifactId為maven-archetype-webapp即可,如下命令

? ? ? ?mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

其他:

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

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

對于apache的log4j沒有l(wèi)og4j.properties文件或是目錄錯誤,會報如下異常

? ? ?log4j:WARN No appenders could be found for logger ? ? ?(org.apache.commons.httpclient.HttpClient).

? ? ?log4j:WARN Please initialize the log4j system properly.

4、maven常用參數(shù)和命令

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

4.1 mvn常用參數(shù)

mvn -e 顯示詳細(xì)錯誤

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

mvn -o 運行offline模式,不聯(lián)網(wǎng)更新依賴

mvn -N僅在當(dāng)前項目模塊執(zhí)行命令,關(guān)閉reactor

mvn -pl module_name在指定模塊上執(zhí)行命令

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

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

mvn -Pxxx引用profile xxx

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

mvn test-compile 編譯測試代碼

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

mvn compile 編譯項目

mvn package 打包,此時target目錄下會出現(xiàn)maven-quickstart-1.0-SNAPSHOT.jar文件,即為打包后文件

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

每個phase都可以作為goal,也可以聯(lián)合,如之前介紹的mvn clean install

4.3 maven 日用三板斧

mvn archetype:generate 創(chuàng)建maven項目

mvn package 打包,上面已經(jīng)介紹過了

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

mvn install 打包并安裝到本地庫

mvn eclipse:eclipse 生成eclipse項目文件

mvn eclipse:clean 清除eclipse項目文件

mvn site 生成項目相關(guān)信息的網(wǎng)站

4.4 maven插件常用參數(shù)

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,上述的開關(guān)缺省已打開)

4.5 maven簡單故障排除

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

set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m 調(diào)大jvm內(nèi)存和持久代,maven/jvm out of memory error

mvn -X maven log level設(shè)定為debug在運行

mvndebug 運行jpda允許remote debug

mvn –help 這個就不說了。。

5、maven擴展

maven常用插件配置和使用

6、maven配置

為了修改maven創(chuàng)建項目默認(rèn)以來的jdk版本,看了下maven配置

maven2.0默認(rèn)使用jdk1.5導(dǎo)致反省、@override 等annotation不可用。可用兩種方法修改jdk版本

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

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

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

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

這樣便能對所有默認(rèn)的maven項目指定jdk為1.6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容