Maven 入門教程

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末初厚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孙技,更是在濱河造成了極大的恐慌产禾,老刑警劉巖绪杏,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕾久,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門障簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人站故,你說我怎么就攤上這事∥髀ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵岂津,是天一觀的道長。 經(jīng)常有香客問我悦即,道長吮成,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任辜梳,我火速辦了婚禮粱甫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘作瞄。我一直安慰自己茶宵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布粉洼。 她就那樣靜靜地躺著节预,像睡著了一般。 火紅的嫁衣襯著肌膚如雪属韧。 梳的紋絲不亂的頭發(fā)上安拟,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音宵喂,去河邊找鬼糠赦。 笑死,一個胖子當(dāng)著我的面吹牛锅棕,可吹牛的內(nèi)容都是我干的拙泽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裸燎,長吁一口氣:“原來是場噩夢啊……” “哼顾瞻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起德绿,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荷荤,失蹤者是張志新(化名)和其女友劉穎退渗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕴纳,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡会油,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了古毛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻翩。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稻薇,靈堂內(nèi)的尸體忽然破棺而出嫂冻,到底是詐尸還是另有隱情,我是刑警寧澤塞椎,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布絮吵,位于F島的核電站,受9級特大地震影響忱屑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暇昂,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一莺戒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧急波,春花似錦澄暮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卡啰。三九已至,卻和暖如春振湾,著一層夾襖步出監(jiān)牢的瞬間亡脸,已是汗流浹背树酪。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摧茴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓娃豹,卻偏偏與公主長得像懂版,于是被迫代替她去往敵國和親躏率。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理夯到,服務(wù)發(fā)現(xiàn),斷路器阅爽,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • |-1-更新內(nèi)容[6.從倉庫解析依賴的機制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構(gòu)件付翁,在ma...
    zlcook閱讀 6,059評論 0 25
  • Maven簡單介紹 Maven是一個項目管理工具胆敞。強大杂伟,但是很容易使用。 它包含了: 一個項目對象模型 (Proj...
    高公子Daniel閱讀 4,240評論 4 60
  • zgrcjtcsxlsg閱讀 240評論 0 0