Maven 簡介
Apache Maven 是一套軟件工程管理和整合工具≡疲基于工程對象模型(POM)的概念绍填,通過一個中央信息管理模塊,Maven 能夠管理項目的構(gòu)建栖疑、報告和文檔讨永。
Maven 工程結(jié)構(gòu)和內(nèi)容被定義在一個 xml 文件中 - pom.xml,是 Project Object Model (POM) 的簡稱遇革,此文件是整個 Maven 系統(tǒng)的基礎(chǔ)組件卿闹。
官網(wǎng)地址:http://maven.apache.org/
Maven 的另外一個定義
Paste_Image.png
(一) Maven - POM
1. POM 代表工程對象模型。
它是使用 Maven 工作時的基本組建萝快,是一個 xml 文件锻霎。它被放在工程根目錄下,文件命名為 pom.xml揪漩。
2. POM 也包含了目標(biāo)和插件旋恼。
當(dāng)執(zhí)行一個任務(wù)或者目標(biāo)時,Maven 會查找當(dāng)前目錄下的 POM奄容,從其中讀取所需要的配置信息冰更,然后執(zhí)行目標(biāo)产徊。能夠在 POM 中設(shè)置的一些配置如下:
project dependencies
plugins
goals
build profiles
project version
developers
mailing list
3. 在創(chuàng)建 POM 之前,我們首先確定工程組(groupId)蜀细,及其名稱(artifactId)和版本舟铜,在倉庫中這些屬性是工程的唯一標(biāo)識。
4. 所有的Maven項目都擴展自超級POM, 我們可以在maven安裝目錄中找到并查看到奠衔。
(二) Maven 的生命周期
1. Maven的生命周期分為三種標(biāo)準(zhǔn)的生命周期
清理 -- Clean 在進(jìn)行真正的構(gòu)建之前谆刨,進(jìn)行清理工作
構(gòu)建 -- Default 構(gòu)建部分,編譯涣觉,測試痴荐,打包,部署官册,都在這個生命周期
站點 -- Site 生成項目報告生兆,站點
參考鏈接 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
(1)Clean分為以下階段
pre-clean 執(zhí)行在clean之前完成的工作
clean 清除上一次構(gòu)建生成的文件
post-clean 執(zhí)行在clean之后立刻完成的工作
(2)Site 有以下階段
pre-site 執(zhí)行在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執(zhí)行生成站點文檔之后的工作
site-deploy 將生成的站點文檔部署到特定的服務(wù)器上
(3)Default有以下(重要)階段
validate 驗證工程是否正確,并且必要信息是否可用
initialize 初始化build狀態(tài)等工作膝宁,設(shè)置屬性或創(chuàng)建目錄
prepare-resources 拷貝資源
compile 編譯源代碼
test-compile 編譯單元測試源代碼
test 單元測試鸦难,代碼不被打包和部署
package 獲取編譯好的代碼,并根據(jù)其可發(fā)布的格式進(jìn)行打包员淫,比如Jar, War
install 安裝包到本地的倉庫合蔽,使其被本地的其他工程所依賴
deploy 復(fù)制最終的包到遠(yuǎn)程的倉庫,分享給其他的開發(fā)者或者項目
以上為重要階段介返,全部階段需參考文檔:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
(三) Maven 倉庫
1. 基本概念
Maven倉庫存儲所有的工程 jar 文件拴事、library jar 文件、插件或任何其他的工程指定的文件圣蝎。
2. 倉庫類型
Maven 倉庫有三種類型:
本地倉庫 local
中央倉庫 central
遠(yuǎn)程倉庫 remote
i. 本地倉庫
Maven 的本地倉庫刃宵,在你第一次運行任何 maven 命令的時候創(chuàng)建的,默認(rèn)被創(chuàng)建在 %USER_HOME% 目錄下徘公。要修改默認(rèn)位置牲证,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 文件中定義另一個路徑,如:<localRepository>D:/T/RexenBMSite/RexenBMSite/doc/maven/maven/repository</localRepository>
Maven 本地倉庫保存你的工程的所有依賴(library jar关面、plugin jar 等)坦袍。當(dāng)你運行一次 Maven 構(gòu)建,Maven 會自動下載所有依賴的 jar 文件到本地倉庫中等太。它避免了每次構(gòu)建時都引用遠(yuǎn)程機器上的依賴文件捂齐。
ii. 中央倉庫
Maven 中央倉庫是由 Maven 社區(qū)提供的倉庫,其中包含了大量也是最全面的常用的資源缩抡。
要瀏覽中央倉庫的內(nèi)容辛燥,maven 社區(qū)提供了一個 URL:http://search.maven.org/#browse。使用這個倉庫,開發(fā)人員可以搜索所有可以獲取的代碼庫挎塌。
iii. 遠(yuǎn)程倉庫
如果 Maven 在中央倉庫中也找不到依賴的庫文件,它會停止構(gòu)建過程并輸出錯誤信息到控制臺内边。為避免這種情況榴都,Maven 提供了遠(yuǎn)程倉庫的概念,它是開發(fā)人員自己定制倉庫漠其,包含了所需要的庫文件嘴高。
3. Maven對于依賴庫的搜索順序
步驟 1 ,在本地倉庫中搜索和屎,如果找不到拴驮,執(zhí)行步驟 2,如果找到了則執(zhí)行其他操作柴信。
步驟 2 套啤,在中央倉庫中搜索,如果找不到随常,并且遠(yuǎn)程倉庫已設(shè)置潜沦,則執(zhí)行步驟 4,如果找到了則下載到本地倉庫绪氛。
步驟 3 唆鸡,如果遠(yuǎn)程倉庫沒有被設(shè)置,Maven 將簡單的停滯處理并拋出錯誤(無法找到依賴的文件的錯誤)枣察。
步驟 4 争占,在一個或多個遠(yuǎn)程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫序目,否則 Maven 將停止處理并拋出錯誤(無法找到依賴的文件的錯誤)臂痕。
(四) Maven 依賴管理
由于Maven工程中是使用groupId, artifactId, version唯一定義的,所以我們可以根據(jù)此唯一標(biāo)識宛琅,在POM中定義對其他工程的依賴
1. 傳遞依賴
當(dāng)一個庫 A 依賴于其他庫 B. 另一工程 C 想要使用庫 A, 那么該工程同樣也需要使用到庫 B, Maven 可以避免去搜索所有需要的庫資源的這種需求刻蟹。通過讀取工程文件(pom.xml)中的依賴項,Maven 可以找出工程之間的依賴關(guān)系嘿辟。我們只需要在每個工程的 pom 文件里去定義直接的依賴關(guān)系舆瘪。Maven 則會自動的來接管后續(xù)的工作。
但是红伦,通過傳遞依賴英古,所有被包含的庫的圖形可能會快速的增長。當(dāng)重復(fù)的庫存在時昙读,可能出現(xiàn)的情形將會持續(xù)上升(此處會通過實際工程舉例說明)召调。Maven 提供一些功能來控制可傳遞的依賴的程度。
2. 依賴控制
(1)依賴調(diào)節(jié)
決定當(dāng)多個手動創(chuàng)建的版本同時出現(xiàn)時,哪個依賴版本將會被使用唠叛。 如果兩個依賴版本在依賴樹里的深度是一樣的時候只嚣,第一個被聲明的依賴將會被使用。比如艺沼,A -> B -C D->E-C 那么如果A先聲明册舞,則先使用A依賴的C。如果深度不一致障般,則優(yōu)先采用最短路徑调鲸,選取依賴庫。
(2)依賴管理(Dependency Management)
Maven提供dependencyManagement 元素既能讓子模塊繼承到父模塊的依賴配置挽荡,又能保證自模塊依賴的使用靈活性藐石。 即,在繼承時定拟,繼承的是配置于微,而不是整體繼承依賴,子POM中办素,引用時不需要引用版本號角雷,如果子POM的對應(yīng)上級POM的Dependency帶有版本,則會覆蓋從父模塊繼承下來的該依賴性穿。
(3)依賴范圍
compile 編譯范圍
默認(rèn)范圍勺三,如果沒有提供范圍,那么依賴范圍就是編譯范圍需曾;
provided 已提供范圍
如果范圍是provided吗坚,那么當(dāng)JDK,或容器已經(jīng)提供該依賴之后才使用這個依賴,非傳遞性的呆万,不會被打包商源;
runtime 運行時范圍
如果一個依賴是runtime依賴范圍,那么該依賴在運行和測試系統(tǒng)的時候才使用谋减,在編譯和打包的時候不需要牡彻,比如,在編譯時出爹,只需要JDBC API Jar文件庄吼,而只有在測試和運行的時候才需要JDBC的具體實現(xiàn)的Jar文件
test 測試范圍
只有在測試和測試編譯的時候需要,不會被打包
system 系統(tǒng)范圍(一般不推薦)
如果一個依賴的依賴范圍是系統(tǒng)范圍严就,那么必須顯示的提供一個本地系統(tǒng)中的JAR文件的路徑总寻,也就是說Maven不會在倉庫中查找依賴,而是直接引用這個外部依賴梢为,以保障編譯和運行渐行。
(4)排除依賴
任何可傳遞的依賴都可以通過 "exclusion" 元素被排除在外轰坊。舉例說明,A 依賴 B祟印, B 依賴 C肴沫,因此 A 可以標(biāo)記 C 為 “被排除的”。
(5)可選依賴
A編譯時有一個依賴B旁理,但對于B中的功能并不一定是使用的樊零,所以當(dāng)C引用A時并不一定需要在運行時引用B, 這時A依賴B標(biāo)記為可選依賴,如果C真正需要B時孽文,則顯示聲明依賴B。
(五)創(chuàng)建第一個maven工程
(1) 準(zhǔn)備工作
將 http://repo1.maven.org/maven2/archetype-catalog.xml 文件下載到本地夺艰,并復(fù)制到maven 倉庫中芋哭,如下目錄
~\repository\org\apache\maven\archetype\archetype-catalog\2.x
在附件other-resources文件夾下可以找到已經(jīng)下載好的該文件
(2) 創(chuàng)建java web工程
進(jìn)入控制臺,執(zhí)行如下命令
mvn archetype:generate -DgroupId=org.gh.mavenx -DartifactId=simple -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
可以創(chuàng)建
(3)打包
進(jìn)入控制臺郁副,執(zhí)行如下命令
mvn clean package
即可在”工程名/target”目錄下生成war包
(4)測試
將war包copy至Tomcat下减牺,用瀏覽器成功查看。
(5)查看該maven工程真正運行所根據(jù)的pom
執(zhí)行如下命令查看
mvn help:effective-pom
可以看到輸出至控制臺的是包含默認(rèn)設(shè)置的pom.xml
(6)理解clean 和 default 生命周期的獨立性
執(zhí)行 mvn clean compile 或 mvn clean package
再執(zhí)行 mvn compile clean 或 mvn package clean
查看效果存谎,說明這兩個標(biāo)準(zhǔn)的生命周期之間是互相獨立的拔疚。
(7)理解插件,目標(biāo)既荚,和階段的關(guān)系
Note: “maven-jar-plugin 插件的jar目標(biāo)稚失,被綁定到package階段”,”一個階段可以綁定多個目標(biāo)恰聘,一個插件可以由多個目標(biāo)組成”
執(zhí)行 mvn clean jar:jar
查看所打包的jar包的內(nèi)容
再執(zhí)行 mvn clean compile jar:jar
再次查看打包的內(nèi)容句各,對比之前執(zhí)行的mvn package效果,通過兩次查看效果晴叨,可以清晰的看出凿宾,maven-jar-plugin這個插件,包含目標(biāo)jar, 只有package階段有此能力兼蕊,此目標(biāo)被綁定到package階段
(8)理解maven生命周期 的各個階段的有序性
執(zhí)行 mvn xxx 查看有序性效果
(9)查看maven插件信息
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull