接觸maven已經很久了,在清理電腦資料中發現以前寫的一篇maven培訓的文章,整理下發出來方便初學者了解下一些maven的基礎(文中沒提到的請參考官網)。
一、什么是Maven?
Maven是Apache下的開源項目http://maven.apache.org/。
Maven有“內行”和“專家”的意思,也可以翻譯成為“知識的積累”。
Apache Maven is a software project management and comprehension tool.
Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
Maven是軟件項目管理和理解的工具。
基于項目對象模型POM(Project-Object-Model),Maven開源通過一小段描述信息來管理項目構建,報告和文檔。
二、為什么用Maven?
以前我們普通的java項目,當需要依賴包的時候需要從其官網上下載對應的依賴jar包,需要我們手動的導入到lib文件夾下。而用maven構建項目,我們只需要寫上jar包的名字和版本信息,maven會自動去網站上下載我們需要的jar。執行代碼的時候需要我們去編譯、運行單元測試、生成文檔、打包、部署,而maven工具為我們封裝了這些重復的工作。
1. Maven讓build過程簡單
Maven有中心倉庫https://repo.maven.apache.org/maven2 ,默認配置都會去中心倉庫下載包;下載的包會存儲到本地倉庫。項目中一般會搭建私有倉庫,用來管理項目中相關的包。
不需要去到處找jar,只需要添加依賴。可以通過http://mvnrepository.com/ 去找。
代碼復用,可以將公共的代碼或者其他人需要調用的jar抽離出來發布到私有Maven庫上,其他人只需要關注需要用引入依賴,不需要關心依賴的jar。
2. Maven可以方便的發布版本
Maven提供了很方便的插件進行版本發布,通過簡單的命令(mvn deploy)就能將工程發布到Maven倉庫中。
3. 方便學習開源項目
github和碼云上大多數的開源項目都會用到Maven,可以通過Maven命令直接運行。
三、Maven安裝
首先要必須安裝java,Maven3.3以上版本必須要jdk1.7以上版本。
在Maven官網下載頁https://maven.apache.org/download.cgi 找到需要的安裝包以及系統要求:
將安裝包復制到需要安裝Maven的機器上解壓,然后設置環境變量M2_HOME,指向對應的Maven目錄;然后將M2_HOME\bin加到path中。(這里就不詳細描述怎么配置環境變量了,系統不一樣配置方式不一樣,linux記得source下讓環境變量生效)。
在命令行執行
mvn -v
查看是否安裝成功。
四、Maven配置
1.setting.xml 配置
在maven安裝目錄下進入conf文件夾,可以找到setting.xml文件。
詳細介紹http://maven.apache.org/settings.html
一般我們需要修改的配置:
localRepository:本地存儲artifacts路徑,所有下載的包和本地安裝的包都會放在這里。
servers:發布snapshot和release的server,和項目設置結合使用
對應的pom設置(這里配置的url是搭建好的maven私服地址):
mirrors:倉庫鏡像,通過鏡像去獲取包(地址是搭建好的maven私服地址)
profiles:我們這里是用來激活配置的maven鏡像去下載maven2中心庫的包(其中配置的地址是maven倉庫的默認地址)
2. pom文件
pom是項目對象模型 (Project Object Model)的簡稱,當Maven運行的時候它向項目對象模型(POM)查看關于這個項目的信息。POM回答類似這樣的問題:這個項目是什么類型的?這個項目的名稱是什么?這個項目的構建有自定義么?
詳細介紹可以查看http://maven.apache.org/pom.html
2.1 Maven坐標(Coordinates)
groupId, artifactId, version和packaging這些組合的標識符拼成了一個項目的坐標:
groupId :團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以創建這個項目的組織名稱的逆向域名(reverse domain name)開頭。來自Sonatype的項目有一個以com.sonatype開頭的groupId,而Apache Software的項目有以 org.apache開頭的groupId。
artifactId:在groupId下的表示一個單獨項目的唯一標識符。
version:一個項目的特定版本。發布的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目可以用一個特殊的標識,這種標識給版本加上 一個“SNAPSHOT”的標記。
packaging:項目的類型,默認是jar,描述了項目打包后的輸出。類型為jar的項目產生一個 JAR文件,類型為war的項目產生一個web應用。
Maven倉庫(repositories)(公共的,私有的,和本地的)是通過這些標識符來組織的。當一個項目被安裝到本地的Maven倉庫,它立刻能被任何其它的項目所使用。而我們所需要做的只是,在其它項目用使用Maven的唯一坐標來加入對這個特定 構件的依賴。
2.2 Maven依賴管理 (Dependency Management)
在<dependencies>標簽中,根據maven坐標來定義:
這里發現與maven坐標不同的是多了scope。
Dependency scope 是用來限制Dependency的作用范圍的, 影響maven項目在各個生命周期時導入的package的狀態。
compile:默認的scope,表示 dependency 都可以在生命周期中使用。而且,這些dependencies 會傳遞到依賴的項目中。
provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。使用這個時,不會將包打入本項目中,只是依賴過來。
runtime:表示dependency不作用在編譯時,但會作用在運行和測試時
test:表示dependency作用在測試時,不作用在運行時。
system:跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查找它。
我們項目中一般使用默認的compile和test范圍。
一個復雜的項目將會包含很多依賴,也有可能包含依賴于其它構件的依賴。這是Maven 最強大的特征之一,它支持了傳遞性依賴(transitive dependencies)。假如你的項目依賴于一個庫,而這個庫又依賴于五個或者十個其它的庫(就像Spring或者 Hibernate那樣)。你不必找出所有這些依賴然后把它們寫在你的pom.xml里,你只需 要加上你直接依賴的那些庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的項目 中。Maven也會處理這些依賴中的沖突,同時能讓你自定義默認行為,或者排除一些特定的傳遞性依賴。
2.3 Maven構建(build)
根據需要添加插件構建項目:
具體的plugins可以參考官網http://maven.apache.org/plugins/index.html (除了Build plugins還有下面要介紹的Reporting plugins)
2.4 Maven報表(reporting)
Maven可以同過mvn site來生成文檔和報告,生成doc文檔需要額外引用插件:
五、Maven命令
在介紹什么是Maven的時候提到‘運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯’,Maven的命令是基于生命周期來執行的。
5.1 Maven生命周期
Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,這三套生命周期分別是:
Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 生成項目報告,站點,發布站點。
最核心的是Default Lifecycle:
記住,運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什么我們運行mvn install 的時候,代碼會被編譯,測試,打包。
官網詳細介紹查看:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
5.2 Maven常用命令
mvn test 運行應用程序中的單元測試
mvn clean 清除項目目錄中的生成結果
mvn package 根據項目生成的指定格式的文件(jar,war。。。)
mvn install 在本地Repository中安裝
mvn site 生成項目相關信息的網站 需要檢查項目的doc注解是否合要求。
mvn deploy 發布項目到公司的maven庫。 執行這個命令時需要有nexus賬號,并且有權限發布。開發過程中只有在其他人需要用到你開發的包時需要做發布操作,需要確保發布到公司nexus上的包是經過測試的穩定的。
可以組合著用,比如最常用的組合:mvn clean install。
六、Maven repository管理工具
參考官網介紹http://maven.apache.org/repository-management.html
搭建私服一般會用Sonatype Nexus OSS
如果有興趣自己在windows下搭建maven私服的可以參考windows下搭建maven私服。