maven入門(下)

作者:George Ma
第一篇文章大概的介紹了一下Apache Maven以及它的下載和安裝,并且運(yùn)行了一個(gè)簡(jiǎn)單的示例逛裤。那么在對(duì)maven有了一點(diǎn)接觸后,接下去的一步是要了解maven的核心概念帮坚,這樣才能在使用maven的時(shí)候游刃有余踩身。
接下來我們介紹下面這幾個(gè)核心概念:
POM (Project Object Model)
Maven 插件
Maven 生命周期
Maven 依賴管理
Maven 庫(kù)

POM (Project Object Model)
一個(gè)項(xiàng)目所有的配置都放置在 POM 文件中:定義項(xiàng)目的類型、名字吐句,管理依賴關(guān)系胁后,定制插件的行為等等。比如說嗦枢,你可以配置 compiler 插件讓它使用 java 1.5 來編譯攀芯。
現(xiàn)在看一下第一篇文章中示例的 POM
Xml 代碼
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>helloworld</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐標(biāo)文虏,它能唯一的確定一個(gè)項(xiàng)目侣诺。有了 maven 坐標(biāo),我們就可以用它來指定我們的項(xiàng)目所依賴的其他項(xiàng)目氧秘,插件年鸳,或者父項(xiàng)目。一般 maven 坐標(biāo)寫成如下的格式:
groupId:artifactId:packaging:version
像我們的例子就會(huì)寫成:
com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT
我們的 helloworld 示例很簡(jiǎn)單丸相,但是大項(xiàng)目一般會(huì)分成幾個(gè)子項(xiàng)目搔确。在這種情況下,每個(gè)子項(xiàng)目就會(huì)有自己的 POM 文件,然后它們會(huì)有一個(gè)共同的父項(xiàng)目妥箕。這樣只要構(gòu)建父項(xiàng)目就能夠構(gòu)建所有的子項(xiàng)目了滥酥。子項(xiàng)目的 POM 會(huì)繼承父項(xiàng)目的 POM。另外畦幢,所有的 POM都繼承了一個(gè) Super-POM坎吻。Super-POM 設(shè)置了一些默認(rèn)值,比如在第一篇文章中提到的默認(rèn)的目錄結(jié)構(gòu)宇葱,默認(rèn)的插件等等瘦真,它遵循了慣例優(yōu)于配置的原則。所以盡管我們的這個(gè) POM 很簡(jiǎn)單黍瞧,但是這只是你看得見的一部分诸尽。運(yùn)行時(shí)候的 POM 要復(fù)雜的多。 如果你想看到運(yùn)行時(shí)候的 POM 的全部?jī)?nèi)容的話印颤,可以運(yùn)行下面的命令:
$mvn help:effective-pom
Maven 插件
第一篇文章中您机,我們用了 mvn archetype:generate 命令來生成一個(gè)項(xiàng)目。那么這里的 archetype:generate 是什么意思呢年局?archetype 是一個(gè)插件的名字际看,generate是目標(biāo)(goal)的名字。這個(gè)命令的意思是告訴 maven 執(zhí)行 archetype 插件的 generate 目標(biāo)矢否。插件目標(biāo)通常會(huì)寫成pluginId:goalId
一個(gè)目標(biāo)是一個(gè)工作單元仲闽,而插件則是一個(gè)或者多個(gè)目標(biāo)的集合。比如說Jar插件僵朗,Compiler插件赖欣,Surefire插件等。從看名字就能知道验庙,Jar 插件包含建立Jar文件的目標(biāo)顶吮, Compiler 插件包含編譯源代碼和單元測(cè)試代碼的目標(biāo)。Surefire 插件的話壶谒,則是運(yùn)行單元測(cè)試云矫。
看到這里,估計(jì)你能明白了汗菜,mvn 本身不會(huì)做太多的事情让禀,它不知道怎么樣編譯或者怎么樣打包。它把構(gòu)建的任務(wù)交給插件去做陨界。插件定義了常用的構(gòu)建邏輯巡揍,能夠被重復(fù)利用。這樣做的好處是菌瘪,一旦插件有了更新腮敌,那么所有的 maven 用戶都能得到更新阱当。
Maven 生命周期
上一篇文章中,我們用的第二個(gè)命令是:mvn package糜工。這里的 package 是一個(gè)maven的生命周期階段 (lifecycle phase )弊添。生命周期指項(xiàng)目的構(gòu)建過程,它包含了一系列的有序的階段 (phase)捌木,而一個(gè)階段就是構(gòu)建過程中的一個(gè)步驟油坝。
那么生命周期階段和上面說的插件目標(biāo)之間是什么關(guān)系呢?插件目標(biāo)可以綁定到生命周期階段上刨裆。一個(gè)生命周期階段可以綁定多個(gè)插件目標(biāo)澈圈。當(dāng) maven 在構(gòu)建過程中逐步的通過每個(gè)階段時(shí),會(huì)執(zhí)行該階段所有的插件目標(biāo)帆啃。
maven 能支持不同的生命周期瞬女,但是最常用的是默認(rèn)的Maven生命周期 (default Maven lifecycle )。如果你沒有對(duì)它進(jìn)行任何的插件配置或者定制的話努潘,那么上面的命令 mvn package 會(huì)依次執(zhí)行默認(rèn)生命周期中直到包括 package 階段前的所有階段的插件目標(biāo):
process-resources 階段:resources:resources

compile 階段:compiler:compile

process-classes 階段:(默認(rèn)無(wú)目標(biāo))

process-test-resources 階段:resources:testResources

test-compile 階段:compiler:testCompile

test 階段:surefire:test

prepare-package 階段:(默認(rèn)無(wú)目標(biāo))

package 階段:jar:jar

Maven 依賴管理
之前我們說過诽偷,maven 坐標(biāo)能夠確定一個(gè)項(xiàng)目。換句話說慈俯,我們可以用它來解決依賴關(guān)系渤刃。在 POM 中,依賴關(guān)系是在 dependencies 部分中定義的贴膘。在上面的 POM 例子中,我們用 dependencies 定義了對(duì)于 junit 的依賴:
Xml 代碼
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
那這個(gè)例子很簡(jiǎn)單略号,但是實(shí)際開發(fā)中我們會(huì)有復(fù)雜得多的依賴關(guān)系刑峡,因?yàn)楸灰蕾嚨?jar 文件會(huì)有自己的依賴關(guān)系。那么我們是不是需要把那些間接依賴的 jar 文件也都定義在POM中呢玄柠?答案是不需要突梦,因?yàn)?maven 提供了傳遞依賴的特性。
所謂傳遞依賴是指 maven 會(huì)檢查被依賴的 jar 文件羽利,把它的依賴關(guān)系納入最終解決的依賴關(guān)系鏈中宫患。針對(duì)上面的 junit 依賴關(guān)系,如果你看一下 maven 的本地庫(kù)(我們馬上會(huì)解釋 maven 庫(kù))~/.m2/repository/junit/junit/3.8.1/ 这弧,[圖片上傳中娃闲。。匾浪。(1)]
你會(huì)發(fā)現(xiàn) maven 不但下載了 junit-3.8.1.jar皇帮,還下載了它的 POM 文件。這樣 maven 就能檢查 junit 的依賴關(guān)系蛋辈,把它所需要的依賴也包括進(jìn)來属拾。
在 POM 的 dependencies 部分中,scope 決定了依賴關(guān)系的適用范圍。我們的例子中 junit 的 scope 是 test渐白,那么它只會(huì)在執(zhí)行 compiler:testCompile and surefire:test 目標(biāo)的時(shí)候才會(huì)被加到 classpath 中尊浓,在執(zhí)行 compiler:compile 目標(biāo)時(shí)是拿不到 junit 的。
我們還可以指定 scope 為 provided纯衍,意思是 JDK 或者容器會(huì)提供所需的jar文件栋齿。比如說在做web應(yīng)用開發(fā)的時(shí)候,我們?cè)诰幾g的時(shí)候需要 servlet API jar 文件托酸,但是在打包的時(shí)候不需要把這個(gè) jar 文件打在 WAR 中褒颈,因?yàn)閟ervlet容器或者應(yīng)用服務(wù)器會(huì)提供的。
scope 的默認(rèn)值是 compile励堡,即任何時(shí)候都會(huì)被包含在 classpath 中谷丸,在打包的時(shí)候也會(huì)被包括進(jìn)去。
Maven 庫(kù)
當(dāng)?shù)谝淮芜\(yùn)行 maven 命令的時(shí)候应结,你需要 Internet 連接刨疼,因?yàn)樗獜木W(wǎng)上下載一些文件。那么它從哪里下載呢鹅龄?它是從 maven 默認(rèn)的遠(yuǎn)程庫(kù)(http://repo1.maven.org/maven2) 下載的揩慕。這個(gè)遠(yuǎn)程庫(kù)有 maven 的核心插件和可供下載的 jar 文件。
但是不是所有的 jar 文件都是可以從默認(rèn)的遠(yuǎn)程庫(kù)下載的扮休,比如說我們自己開發(fā)的項(xiàng)目迎卤。這個(gè)時(shí)候,有兩個(gè)選擇:要么在公司內(nèi)部設(shè)置定制庫(kù)玷坠,要么手動(dòng)下載和安裝所需的jar文件到本地庫(kù)蜗搔。
本地庫(kù)是指 maven 下載了插件或者 jar 文件后存放在本地機(jī)器上的拷貝。在 Linux 上八堡,它的位置在 ~/.m2/repository樟凄,在 Windows XP 上,在 C:\Documents and Settings\username.m2\repository 兄渺,在 Windows 7 上缝龄,在 C:\Users\username.m2\repository。當(dāng) maven 查找需要的 jar 文件時(shí)挂谍,它會(huì)先在本地庫(kù)中尋找叔壤,只有在找不到的情況下,才會(huì)去遠(yuǎn)程庫(kù)中找凳兵。
運(yùn)行下面的命令能把我們的 helloworld 項(xiàng)目安裝到本地庫(kù):
$mvn install
一旦一個(gè)項(xiàng)目被安裝到了本地庫(kù)后百新,你別的項(xiàng)目就可以通過 maven 坐標(biāo)和這個(gè)項(xiàng)目建立依賴關(guān)系。比如如果我現(xiàn)在有一個(gè)新項(xiàng)目需要用到 helloworld庐扫,那么在運(yùn)行了上面的 mvn install 命令后饭望,我就可以如下所示來建立依賴關(guān)系:
Xml 代碼
<dependency> <groupId>com.mycompany.helloworld</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
好了仗哨,maven 的核心概念就簡(jiǎn)單的介紹到這里。至于在 Eclipse 中如何使用 maven铅辞,這個(gè)網(wǎng)上很多了厌漂,google 一下就行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斟珊,一起剝皮案震驚了整個(gè)濱河市苇倡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囤踩,老刑警劉巖旨椒,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異堵漱,居然都是意外死亡综慎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門勤庐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示惊,“玉大人,你說我怎么就攤上這事愉镰∶追#” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵丈探,是天一觀的道長(zhǎng)录择。 經(jīng)常有香客問我,道長(zhǎng)碗降,這世上最難降的妖魔是什么糊肠? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮遗锣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗤形。我一直安慰自己精偿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布赋兵。 她就那樣靜靜地躺著笔咽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霹期。 梳的紋絲不亂的頭發(fā)上叶组,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音历造,去河邊找鬼甩十。 笑死船庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侣监。 我是一名探鬼主播鸭轮,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼橄霉!你這毒婦竟也來了窃爷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姓蜂,失蹤者是張志新(化名)和其女友劉穎按厘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钱慢,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮京,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滩字。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片造虏。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖麦箍,靈堂內(nèi)的尸體忽然破棺而出漓藕,到底是詐尸還是另有隱情,我是刑警寧澤挟裂,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布享钞,位于F島的核電站,受9級(jí)特大地震影響诀蓉,放射性物質(zhì)發(fā)生泄漏栗竖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一渠啤、第九天 我趴在偏房一處隱蔽的房頂上張望狐肢。 院中可真熱鬧,春花似錦沥曹、人聲如沸份名。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)僵腺。三九已至,卻和暖如春壶栋,著一層夾襖步出監(jiān)牢的瞬間辰如,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工贵试, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琉兜,地道東北人凯正。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呕童,于是被迫代替她去往敵國(guó)和親漆际。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理夺饲,服務(wù)發(fā)現(xiàn)奸汇,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 1.編寫POM Maven項(xiàng)目的核心文件是pom.xml往声,POM(Project Objcet Model)項(xiàng)目對(duì)...
    zlcook閱讀 5,908評(píng)論 7 26
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    seyvoue閱讀 12,602評(píng)論 1 36
  • 1.好的自我介紹 為什么這份工作非要你來做才適合擂找! 我看到在招聘啟事上,這份工作需要blabla浩销,這和我之前的工...
    phper1021閱讀 255評(píng)論 0 0