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是傳遞性依賴
下邊最左邊一列為第一直接依賴、最上邊是第二直接依賴,中間交叉單元格則表示傳遞性依賴范圍

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)建管理



