二、Maven的POM.xml詳解

Maven項(xiàng)目的核心是pom.xml。POM(Project Object Model,項(xiàng)目對象模型)定義了項(xiàng)目的基本信息,用于描述項(xiàng)目如何構(gòu)建,聲明項(xiàng)目依賴等。


pom文件結(jié)構(gòu).png
一、基本信息
  • modelVersion:指定當(dāng)前POM模型的版本,對Maven2和Maven3來說,他只能是4.0.0
  • groupId:項(xiàng)目的所屬公司或組織的域名倒寫
  • artifactId:如果該項(xiàng)目為一個(gè)Maven模塊,則相當(dāng)于項(xiàng)目名;如果一個(gè)項(xiàng)目包含多個(gè)子模塊,則它們該模塊的名稱;(一般和項(xiàng)目同名)
  • version:該項(xiàng)目的版本信息
  • name:項(xiàng)目名,作用只是一個(gè)更友好的項(xiàng)目名稱,不是必須的。
  • packaging:打包方式,默認(rèn)為jar
二、依賴管理
依賴管理xml結(jié)構(gòu).png

一般添加以來只需要groupId、artifactId、version三個(gè)標(biāo)簽

  • groupId:如上groupId
  • artifactId:如上artifactId
  • version:如上version
  • type:如上packaging,默認(rèn)為jar
  • scope:依賴的范圍 之后詳細(xì)說明
  • optional:標(biāo)記依賴是否可選 之后詳細(xì)說明
  • exclusions:用來排除一些傳遞性依賴 之后詳細(xì)說明
2.1、依賴范圍(scope
  • 首先Maven編譯項(xiàng)目主代碼時(shí)需要一套classpath
  • 其次Maven在編譯和執(zhí)行測試的時(shí)候會使用另一套classpath
  • 最后,在實(shí)際運(yùn)行Maven項(xiàng)目的時(shí)候,又會使用一套classpath

依賴范圍(scope)就是用來控制依賴以上三種classpath(編譯classpath、測試classpath、運(yùn)行classpath)的關(guān)系,具體如下:

  • compile:編譯依賴范圍
    • 如果沒有指定、默認(rèn)為該依賴范圍
    • 使用此范圍,對于編譯、測試、運(yùn)行三種classpath都有效
  • test:測試依賴范圍
    • 只對測試classpath有效
    • 在編譯主代碼和運(yùn)行項(xiàng)目使用時(shí)將無法使用此類依賴
    • 如JUnit
  • provided:編譯及測試依賴范圍
    • 對于編譯及測試classpath有效,但是在運(yùn)行時(shí)無效
    • 例如servlet-api,編譯和測試項(xiàng)目時(shí)需要該依賴,但是在運(yùn)行項(xiàng)目的時(shí)候,容器已經(jīng)提供,所以不需要Maven重復(fù)引入一遍
  • runtime:運(yùn)行時(shí)依賴范圍
    • 對于測試和運(yùn)行的classpath有效
    • 例如JDBC的驅(qū)動(dòng)實(shí)現(xiàn),項(xiàng)目主代碼的編譯只需要JDK提供的JDBC接口,只有在執(zhí)行測試或者運(yùn)行項(xiàng)目的時(shí)候才需要具體JDBC的實(shí)現(xiàn)
  • system:系統(tǒng)依賴范圍
    • 依賴范圍和provided的范圍完全一致
    • 使用該范圍需要使用systemPath元素顯式的依賴文件的路徑
    • 往往和本機(jī)綁定,可能造成構(gòu)建的不可移植


      依賴范圍與classpath的關(guān)系.png
2.2、傳遞性依賴(exclusions

什么是傳遞性依賴?
例如一個(gè)項(xiàng)目依賴spring-core的jar包,然后spring-core依賴commons-logging,則commons-logging為該項(xiàng)目的一個(gè)傳遞性依賴

2.3 傳遞性依賴和依賴范圍

依賴范圍不僅可以控制依賴與三種classpath的關(guān)系,還對傳遞性依賴產(chǎn)生影響。

假設(shè)A依賴B,B依賴C,A對于B是第一直接依賴、B對于C是第二直接依賴、A對于C是傳遞性依賴
下邊最左邊一列為第一直接依賴、最上邊是第二直接依賴,中間交叉單元格則表示傳遞性依賴范圍

依賴范圍影響依賴傳遞.png

2.4依賴調(diào)解

例如有項(xiàng)目A存在以下關(guān)系:A -> B -> C -> X(1.0)、A -> D -> X(2.0),X是A的傳遞性依賴,但是卻有兩個(gè)版本的X,Maven有兩個(gè)原則去調(diào)解依賴重復(fù)。

  • 路徑最近者優(yōu)先
  • 第一聲明者優(yōu)先
    最好的做法:可使用exclusions標(biāo)簽對一些傳遞性依賴進(jìn)行排除
2.5.可選依賴(optional

假如項(xiàng)目A依賴項(xiàng)目B,項(xiàng)目B依賴于項(xiàng)目X和Y,B對于X和Y都是可選依賴:A -> B、B -> X\Y(可選),X、Y不會得以傳遞,稱為傳遞性依賴。
引入這種依賴特性的原因主要是,可能項(xiàng)目B實(shí)現(xiàn)了兩個(gè)特性,一個(gè)特性依賴X,一個(gè)特性依賴Y,而且這兩個(gè)特性是互斥的。

、構(gòu)建管理
構(gòu)建管理常見標(biāo)簽.png
  • finalName:構(gòu)建目標(biāo)文件的名稱,默認(rèn)情況為${artifactId}-${version}
  • defaultGoal:如果指定值package,則相當(dāng)于執(zhí)行命令mvn package
  • directory:構(gòu)建目標(biāo)文件的存放目錄,默認(rèn)在${basedir}/target目錄中
  • plugins:插件的配置,具體的插件配置可進(jìn)行查閱
  • resource:傳送門 ~~
  • pluginManagement:傳送門~~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Maven的基本了解 什么是Maven? Maven就是Apache下的一個(gè)開源項(xiàng)目。它是用純java開發(fā)的。是一...
    Bcome閱讀 3,142評論 0 7
  • 一、maven的兩個(gè)作用 項(xiàng)目自動(dòng)化構(gòu)建,通過命令行就可以完成整個(gè)項(xiàng)目構(gòu)建過程,不需要我們手動(dòng)地進(jìn)行項(xiàng)目構(gòu)建 管理...
    lifeline張閱讀 912評論 0 1
  • maven項(xiàng)目中需要使用到其它依賴時(shí),則需要在pom.xml中配置<dependency>元素也就是依賴聲明,這樣...
    zlcook閱讀 2,040評論 1 3
  • 清風(fēng)拂面,風(fēng)吹來的塵埃迷了雙眼,我站在高城下,潸然落淚,月色搖晃樹影,霓虹的燈光穿梭在繁華的街道上。恍惚間回到從前...
    十二月溪閱讀 688評論 2 6
  • 姓名:戴學(xué)亮 公司:海南蔚藍(lán)時(shí)代實(shí)業(yè)有限公司 組別:第420期利他3組 【日精進(jìn)打卡第152天】 【知~學(xué)習(xí)】 《...
    鄰家阿太閱讀 64評論 0 0

友情鏈接更多精彩內(nèi)容