工程化專題之Maven(上)

前言

在如今的互聯(lián)網(wǎng)項目開發(fā)當中,特別是Java領(lǐng)域啸盏,可以說Maven隨處可見重贺。Maven的倉庫管理、依賴管理宫补、繼承和聚合等特性為項目的構(gòu)建提供了一整套完善的解決方案檬姥,可以說如果你搞不懂Maven曾我,那么一個多模塊的項目足以讓你頭疼粉怕,依賴沖突就會讓你不知所措,甚至搞不清楚項目是如何運行起來的.....OK抒巢,博主就曾經(jīng)被Maven“傷害”過贫贝,那么該專題的目的就是:徹底搞定Maven!


Thinking in Maven

回想一下蛉谜,當你新到一家公司稚晚,安裝完JDK后就會安裝配置Maven(MAVEN_HOME、path)型诚,很大可能性你需要修改settings.xml文件客燕,比如你會修改本地倉庫地址路徑,比如你很可能會copy一段配置到你的settings.xml中(很可能就是私服的一些配置)狰贯。接下來也搓,你會到IDEA或者Eclipse中進行Maven插件配置,然后你就可以在工程中的pom.xml里面開始添加<dependency>標簽來管理jar包涵紊,在Maven規(guī)范的目錄結(jié)構(gòu)下進行編寫代碼傍妒,最后你會通過插件的方式來進行測試、打包(jar or war)摸柄、部署颤练、運行。

上面描述了我們對Maven的一些使用方式驱负,下面我們進行一些思考:

Q1:本地倉庫嗦玖?Maven到底有哪些倉庫患雇?它們什么關(guān)系?

Maven倉庫


本地倉庫路徑配置

你要jar包宇挫,不可能每次都要聯(lián)網(wǎng)去下載吧庆亡,多費勁,所以本地倉庫就是相當于加了一層jar包緩存捞稿,先到這里來查又谋。如果這里查不到,那么就去私服上找娱局,如果私服也找不到彰亥,那么去中央倉庫去找,找到jar后衰齐,會把jar的信息同步到私服和本地倉庫中任斋。

私服,就是公司內(nèi)部局域網(wǎng)的一臺服務器而已耻涛,你想一下废酷,當你的工程Project-A依賴別人的Project-B的接口,怎么做呢抹缕?沒有Maven的時候澈蟆,當然是copy Project-B jar到你的本地lib中引入,那么Maven的方式卓研,很顯然需要其他人把Project-B deploy到私服倉庫中供你使用趴俘。因此私服中存儲了本公司的內(nèi)部專用的jar!不僅如此奏赘,私服還充當了中央倉庫的鏡像寥闪,說白了就是一個代理!

中央倉庫:該倉庫存儲了互聯(lián)網(wǎng)上的jar磨淌,由Maven團隊來維護疲憋,地址是:http://repo1.maven.org/maven2/。


Q2:關(guān)于<dependency>的使用

依賴管理

其實這個標簽揭示了jar的查找坐標:groupId梁只、artifactId缚柳、version

一般而言敛纲,我們可以到私服上輸入artifactId進行搜索喂击,或者到http://search.maven.org/http://mvnrepository.com/上進行查找確定坐標淤翔。

version分為開發(fā)版本(Snapshot)和發(fā)布版本(Release)翰绊,那么為什么要分呢?

在實際開發(fā)中,我們經(jīng)常遇到這樣的場景监嗜,比如A服務依賴于B服務柱锹,A和B同時開發(fā)刨晴,B在開發(fā)中發(fā)現(xiàn)了BUG,修改后,將版本由1.0升級為2.0雕拼,那么A必須也跟著在POM.XML中進行版本升級琅束。過了幾天后纯命,B又發(fā)現(xiàn)了問題争涌,進行修改后升級版本發(fā)布,然后通知A進行升級...可以說這是開發(fā)過程中的版本不穩(wěn)定導致了這樣的問題音五。

Maven惫撰,已經(jīng)替我們想好了解決方案,就是使用Snapshot版本躺涝,在開發(fā)過程中B發(fā)布的版本標志為Snapshot版本厨钻,A進行依賴的時候選擇Snapshot版本,那么每次B發(fā)布的話坚嗜,會在私服倉庫中夯膀,形成帶有時間戳的Snapshot版本,而A構(gòu)建的時候會自動下載B最新時間戳的Snapshot版本苍蔬!


Q3:既然Maven進行了依賴管理诱建,為什么還會出現(xiàn)依賴沖突?處理依賴沖突的手段是银室?

依賴的版本涂佃?

首先來說,對于Maven而言蜈敢,同一個groupId同一個artifactId下,只能使用一個version汽抚!

根據(jù)上圖的依賴順序抓狭,將使用1.2版本的jar。

現(xiàn)在造烁,我們可以思考下了否过,比如工程中需要引入A、B惭蟋,而A依賴1.0版本的C苗桂,B依賴2.0版本的C,那么問題來了告组,C使用的版本將由引入A煤伟、B的順序而定?這顯然不靠譜!如果A的依賴寫在B的依賴后面便锨,將意味著最后引入的是1.0版本的C围辙,很可能在運行階段出現(xiàn)類(ClassNotFoundException)、方法(NoSuchMethodError)找不到的錯誤(因為B使用的是高版本的C)放案!

這里其實涉及到了2個概念:依賴傳遞(transitive)姚建、Maven的最近依賴策略。

依賴傳遞:如果A依賴B吱殉,B依賴C掸冤,那么引入A,意味著B和C都會被引入友雳。

Maven的最近依賴策略:如果一個項目依賴相同的groupId贩虾、artifactId的多個版本,那么在依賴樹(mvn dependency:tree)中離項目最近的那個版本將會被使用沥阱。(從這里可以看出Maven是不是有點小問題呢缎罢?能不能選擇高版本的進行依賴么?據(jù)了解考杉,Gradle就是version+策略)

現(xiàn)在策精,我們可以想想如何處理依賴沖突呢?

想法1:要使用哪個版本崇棠,我們是清楚的咽袜,那么能不能不管如何依賴傳遞,都可以進行版本鎖定呢枕稀?

使用<dependencyManagement> ?[這種主要用于子模塊的版本一致性中]

想法2:在依賴傳遞中询刹,能不能去掉我們不想依賴的?

使用<exclusions> [在實際中我們可以在IDEA中直接利用插件幫助我們生成]

想法3:既然是最近依賴策略萎坷,那么我們就直接使用顯式依賴指定版本凹联,那不就是最靠近項目的么?

使用<dependency>


Q4:引入依賴的最佳實踐哆档,提前發(fā)現(xiàn)問題蔽挠!

在工程中,我們避免不了需要加一些依賴瓜浸,也許加了依賴后運行時才發(fā)現(xiàn)存在依賴沖突在去解決澳淑,似乎有點晚!那么能不能提前發(fā)現(xiàn)問題呢插佛?

如果我們新加入一個依賴的話杠巡,那么先通過mvn dependency:tree命令形成依賴樹,看看我們新加入的依賴雇寇,是否存在傳遞依賴氢拥,傳遞依賴中是否和依賴樹中的版本存在沖突蚌铜,如果存在多個版本沖突,利用上文的方式進行解決兄一!


Q5:Maven規(guī)范化目錄結(jié)構(gòu)

簡單Java工程目錄結(jié)構(gòu)

這里需要注意2點:

第一:src/main下內(nèi)容最終會打包到Jar/War中厘线,而src/test下是測試內(nèi)容,并不會打包進去出革。

第二:src/main/resources中的資源文件會COPY至目標目錄造壮,這是Maven的默認生命周期中的一個規(guī)定動作。(想一想骂束,hibernate/mybatis的映射XML需要放入resources下耳璧,而不能在放在其他地方了)


Q6:Maven的生命周期

Maven生命周期

我們只需要注意一點:執(zhí)行后面的命令時,前面的命令自動得到執(zhí)行展箱。

實際上旨枯,我們最常用的就是這么幾個:

clean:有問題,多清理混驰!

package:打成Jar or War包攀隔,會自動進行clean+compile

install:將本地工程Jar上傳到本地倉庫

deploy:上傳到私服


Q7:關(guān)于scope依賴范圍

既然,Maven的生命周期存在編譯栖榨、測試昆汹、運行這些過程,那么顯然有些依賴只用于測試婴栽,比如junit满粗;有些依賴編譯用不到,只有運行的時候才能用到愚争,比如mysql的驅(qū)動包在編譯期就用不到(編譯期用的是JDBC接口)映皆,而是在運行時用到的;還有些依賴轰枝,編譯期要用到捅彻,而運行期不需要提供,因為有些容器已經(jīng)提供了狸膏,比如servlet-api在tomcat中已經(jīng)提供了沟饥,我們只需要的是編譯期提供而已。

總結(jié)來說:

compile:默認的scope湾戳,運行期有效,需要打入包中广料。

provided:編譯期有效砾脑,運行期不需要提供,不會打入包中艾杏。

runtime:編譯不需要韧衣,在運行期有效,需要導入包中。(接口與實現(xiàn)分離)

test:測試需要畅铭,不會打入包中氏淑。

system:非本地倉庫引入、存在系統(tǒng)的某個路徑下的jar硕噩。(一般不使用)


Maven虐我千百遍假残,我待Maven如初戀!

下篇更精彩炉擅,See you辉懒!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谍失,隨后出現(xiàn)的幾起案子眶俩,更是在濱河造成了極大的恐慌,老刑警劉巖快鱼,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颠印,死亡現(xiàn)場離奇詭異,居然都是意外死亡抹竹,警方通過查閱死者的電腦和手機线罕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柒莉,“玉大人闻坚,你說我怎么就攤上這事【ばⅲ” “怎么了窿凤?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跨蟹。 經(jīng)常有香客問我雳殊,道長,這世上最難降的妖魔是什么窗轩? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任夯秃,我火速辦了婚禮,結(jié)果婚禮上痢艺,老公的妹妹穿的比我還像新娘仓洼。我一直安慰自己,他們只是感情好堤舒,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布色建。 她就那樣靜靜地躺著,像睡著了一般舌缤。 火紅的嫁衣襯著肌膚如雪箕戳。 梳的紋絲不亂的頭發(fā)上某残,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音陵吸,去河邊找鬼玻墅。 笑死,一個胖子當著我的面吹牛壮虫,可吹牛的內(nèi)容都是我干的澳厢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旨指,長吁一口氣:“原來是場噩夢啊……” “哼赏酥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谆构,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤裸扶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搬素,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵晨,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年熬尺,在試婚紗的時候發(fā)現(xiàn)自己被綠了摸屠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡粱哼,死狀恐怖季二,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揭措,我是刑警寧澤胯舷,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站绊含,受9級特大地震影響桑嘶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躬充,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一逃顶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧充甚,春花似錦以政、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疆瑰,卻和暖如春眉反,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穆役。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工寸五, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耿币。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓梳杏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淹接。 傳聞我的和親對象是個殘疾皇子十性,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)塑悼,斷路器劲适,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • |-1-更新內(nèi)容[6.從倉庫解析依賴的機制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構(gòu)件,在ma...
    zlcook閱讀 6,026評論 0 25
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 首先私服是一種衍生出來的特殊的Maven遠程倉庫厢蒜,構(gòu)建私服的好處請看3.5私服 可以幫助大家建立私服的倉庫管理軟件...
    zlcook閱讀 10,529評論 0 32
  • 目前在看nexus私服章節(jié)的知識時需要用到倉庫與鏡像的知識斑鸦,正好通過簡書把倉庫和鏡像章節(jié)的筆記整理一下 倉庫 ma...
    小煉君閱讀 1,269評論 0 48