成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Maven的這7個問題你思考過沒有?

開發 后端
在如今的互聯網項目開發當中,特別是Java領域,可以說Maven隨處可見。Maven的倉庫管理、依賴管理、繼承和聚合等特性為項目的構建提供了一整套完善的解決方案,可以說如果你搞不懂Maven,那么一個多模塊的項目足以讓你頭疼,依賴沖突就會讓你不知所措,甚至搞不清楚項目是如何運行起來的.....
  • 1、本地倉庫?Maven到底有哪些倉庫?它們什么關系?
  • 2、關于的使用
  • 3、既然Maven進行了依賴管理,為什么還會出現依賴沖突?處理依賴沖突的手段是?
  • 4、引入依賴的最佳實踐,提前發現問題!
  • 5、Maven規范化目錄結構
  • 6、Maven的生命周期
  • 7、關于scope依賴范圍

在如今的互聯網項目開發當中,特別是Java領域,可以說Maven隨處可見。Maven的倉庫管理、依賴管理、繼承和聚合等特性為項目的構建提供了一整套完善的解決方案,可以說如果你搞不懂Maven,那么一個多模塊的項目足以讓你頭疼,依賴沖突就會讓你不知所措,甚至搞不清楚項目是如何運行起來的.....OK,博主就曾經被Maven“傷害”過,那么該專題的目的就是:徹底搞定Maven!

回想一下,當你新到一家公司,安裝完JDK后就會安裝配置Maven(MAVEN_HOME、path),很大可能性你需要修改settings.xml文件,比如你會修改本地倉庫地址路徑,比如你很可能會copy一段配置到你的settings.xml中(很可能就是私服的一些配置)。接下來,你會到IDEA或者Eclipse中進行Maven插件配置,然后你就可以在工程中的pom.xml里面開始添加標簽來管理jar包,在Maven規范的目錄結構下進行編寫代碼,最后你會通過插件的方式來進行測試、打包(jar or war)、部署、運行。

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

1、本地倉庫?Maven到底有哪些倉庫?它們什么關系?

Maven倉庫:

Maven 的這 7 個問題你思考過沒有?

 

img

本地倉庫路徑配置:

Maven 的這 7 個問題你思考過沒有?

 

img

你要jar包,不可能每次都要聯網去下載吧,多費勁,所以本地倉庫就是相當于加了一層jar包緩存,先到這里來查。如果這里查不到,那么就去私服上找,如果私服也找不到,那么去中央倉庫去找,找到jar后,會把jar的信息同步到私服和本地倉庫中。

私服,就是公司內部局域網的一臺服務器而已,你想一下,當你的工程Project-A依賴別人的Project-B的接口,怎么做呢?沒有Maven的時候,當然是copy Project-B jar到你的本地lib中引入,那么Maven的方式,很顯然需要其他人把Project-B deploy到私服倉庫中供你使用。因此私服中存儲了本公司的內部專用的jar!不僅如此,私服還充當了中央倉庫的鏡像,說白了就是一個代理!

中央倉庫:該倉庫存儲了互聯網上的jar,由Maven團隊來維護,地址是:http://repo1.maven.org/maven2/。

2、關于的使用

依賴管理:

Maven 的這 7 個問題你思考過沒有?

 

img

Maven 的這 7 個問題你思考過沒有?

 

img

其實這個標簽揭示了jar的查找坐標:groupIdartifactIdversion

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

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

在實際開發中,我們經常遇到這樣的場景,比如A服務依賴于B服務,A和B同時開發,B在開發中發現了BUG,修改后,將版本由1.0升級為2.0,那么A必須也跟著在POM.XML中進行版本升級。過了幾天后,B又發現了問題,進行修改后升級版本發布,然后通知A進行升級...可以說這是開發過程中的版本不穩定導致了這樣的問題。

Maven,已經替我們想好了解決方案,就是使用Snapshot版本,在開發過程中B發布的版本標志為Snapshot版本,A進行依賴的時候選擇Snapshot版本,那么每次B發布的話,會在私服倉庫中,形成帶有時間戳的Snapshot版本,而A構建的時候會自動下載B最新時間戳的Snapshot版本!

3、既然Maven進行了依賴管理,為什么還會出現依賴沖突?處理依賴沖突的手段是?

依賴的版本?

Maven 的這 7 個問題你思考過沒有?

 

img

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

根據上圖的依賴順序,將使用1.2版本的jar。

現在,我們可以思考下了,比如工程中需要引入A、B,而A依賴1.0版本的C,B依賴2.0版本的C,那么問題來了,C使用的版本將由引入A、B的順序而定?這顯然不靠譜!如果A的依賴寫在B的依賴后面,將意味著最后引入的是1.0版本的C,很可能在運行階段出現類(ClassNotFoundException)、方法(NoSuchMethodError)找不到的錯誤(因為B使用的是高版本的C)!

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

依賴傳遞:如果A依賴B,B依賴C,那么引入A,意味著B和C都會被引入。

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

現在,我們可以想想如何處理依賴沖突呢?

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

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

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

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

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

使用

4、引入依賴的最佳實踐,提前發現問題!

在工程中,我們避免不了需要加一些依賴,也許加了依賴后運行時才發現存在依賴沖突在去解決,似乎有點晚!那么能不能提前發現問題呢?

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

5、Maven規范化目錄結構

Maven 的這 7 個問題你思考過沒有?

 

img

這里需要注意2點:

第一:src/main下內容最終會打包到Jar/War中,而src/test下是測試內容,并不會打包進去。

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

6、Maven的生命周期

Maven生命周期:

Maven 的這 7 個問題你思考過沒有?

 

img

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

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

clean:有問題,多清理!

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

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

deploy:上傳到私服

7、關于scope依賴范圍

既然,Maven的生命周期存在編譯、測試、運行這些過程,那么顯然有些依賴只用于測試,比如junit;有些依賴編譯用不到,只有運行的時候才能用到,比如mysql的驅動包在編譯期就用不到(編譯期用的是JDBC接口),而是在運行時用到的;還有些依賴,編譯期要用到,而運行期不需要提供,因為有些容器已經提供了,比如servlet-api在tomcat中已經提供了,我們只需要的是編譯期提供而已。

總結來說:

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

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

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

test:測試需要,不會打入包中。

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

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2022-08-23 08:53:31

Go項目語言

2015-09-08 10:22:42

2024-04-07 00:00:05

事務Java開發

2021-10-15 10:26:56

代碼項目Mapper

2021-06-10 07:59:40

Linux 系統硬件操作系統

2019-10-18 15:16:10

Redis數據庫并發

2021-01-10 23:36:52

SQL數據庫技術

2017-05-17 17:23:00

2020-12-02 14:54:41

JavaScript開發技術

2023-09-01 07:25:39

領域驅動設計DDD

2024-11-21 15:44:21

2012-11-13 16:31:39

效率工作效率項目

2020-12-18 08:59:51

蘋果iCloud儲存照片

2025-02-26 00:43:15

LINQC#工具

2019-03-28 09:14:22

人工智能AI

2024-12-09 08:49:01

2020-08-17 09:31:31

Git命令開發

2018-04-03 14:49:24

2022-05-05 11:21:00

程序優化

2019-07-31 09:06:35

Java跳槽那些事兒文章
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜影院网站 | 一二三在线视频 | 欧美日韩精品久久久免费观看 | h片免费看 | 91精品国产综合久久福利软件 | 手机日韩 | 操操操日日日 | 日韩中文一区 | 国产日韩一区二区三免费高清 | 日韩欧美在线视频 | 国产一区二区精品 | 亚洲精品国产偷自在线观看 | 中文字幕国产精品 | 99精品免费久久久久久日本 | 国产成人精品一区二 | 久久免费国产视频 | 欧美一区在线视频 | 日本在线视频一区二区 | 精品欧美一区二区三区久久久小说 | 成人综合视频在线观看 | 亚洲国产精品99久久久久久久久 | 久久久精品网站 | 久久男女视频 | 国产自产c区| 欧美日韩精品在线免费观看 | 999久久久国产精品 欧美成人h版在线观看 | 日韩精品免费一区二区在线观看 | 日本精品一区二区三区在线观看视频 | 国产精品嫩草影院精东 | av免费成人 | 中文字幕第一页在线 | heyzo在线 | 亚洲精品1区2区3区 91免费看片 | 欧美亚洲国产一区二区三区 | 99久久精品国产一区二区三区 | 男女免费网站 | 久久免费精品视频 | 一区二区三区精品 | 九七午夜剧场福利写真 | 国产精品久久久久久久久动漫 | 在线视频 中文字幕 |