抄一篇maven的備忘
標註下來源:http://www.trinea.cn/android/maven/
由淺入深,主要介紹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文件中節點含義如下:
XHTML
1 2 3 4 5 6 7 8 9 10 11 12 |
project pom文件的頂級元素
modelVersion 所使用的object model版本,為了確保穩定的使用,這個元素是強制性的。除非maven開發者升級模板,否則不需要修改
groupId 是項目創建團體或組織的唯一標誌符,通常是域名倒寫,如groupId org.apache.maven.plugins就是為所有maven插件預留的
artifactId 是項目artifact唯一的基地址名
packaging artifact打包的方式,如jar、war、ear等等。默認為jar。這個不僅表示項目最終產生何種後綴的文件,也表示build過程使用什麽樣的lifecycle。 |
其中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
Java
1 2 3 4 5 6 7 8 | 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代表一個特定任務
Java
1 | 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代碼 收藏代碼
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即可,如下命令
XHTML
1 | 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文件或是目錄錯誤,會報如下異常
XHTML
1 2 | 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配置
maven2.0默認使用jdk1.5導致反省、@override 等annotation不可用。可用兩種方法修改jdk版本
第一種:修改項目的pom.xml,影響單個項目,治標不治本
XHTML
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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://maven.apache.org/download.html
抄一篇maven的備忘