本文主要是針對《maven實戰》書中關鍵知識點的學習記錄,未免有紕漏或描述不到之處,建議購買閱讀原書
首先貼出一個pom常見的一些元素釋義
<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.example</groupId>
<artifactId>my-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>my-demo</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version>版本</version>
<type>依賴的類型,對應於項目的packing,默認是jar</type>
<scope>依賴范圍</scope>
<systemPath>配合 scope=system時使用</systemPath>
<optional>標記是否為可選依賴</optional>
<exclusions>
用來排除傳遞性依賴
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
前面的坐標聲明到依賴類型,都應該比較好理解,這里我們從依賴范圍開始介紹起
依賴范圍
maven中的依賴范圍一共有以下幾種
- compile 默認,對於編譯,測試,運行三個狀態都有效
- test 顧名思義,只針對執行test代碼
- provided 對於編譯和測試時有效,但運行時無效,典型的時servlet-api,運行時這個由容器來提供
- runtime 對測試和運行時有效,但編譯時無效
- system 與provided的范圍一樣,但system必須顯示的指定依賴文件,通過
<systemPath>
來進行指定,是與本機綁定的,所以基本很少用到 - import 不會對3總產生實際的影響,只能在dependencyManagement中使用
以表格來表示的,如下
scope | 編譯 | 測試 | 運行 |
---|---|---|---|
compile | Y | Y | Y |
test | Y | ||
provided | Y | Y | |
runtime | Y | Y | |
system | Y | Y |
傳遞性依賴
我們的工程,所使用的大多數情況下,不會只有一成依賴關系,例如 a依賴b,我們用a->b表示,那么,a->b,b->c,則a對於b是第一依賴,b對於c是第二依賴,而a對於c是傳遞性依賴
傳遞性依賴的scope傳遞規則,與第一依賴和第二依賴有關,下表第一列表示第一依賴,第一行表示第二依賴
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | runtime | ||
test | test | test | ||
provided | provided | provided | provided | |
runtime | runtie | runtime |
從上表我們可以輕松得到幾點信息
- 第二依賴為complie不改變第一依賴
- 第二依賴test不傳遞依賴
- 第二依賴provided只傳遞provided
- 第二依賴runtime對compile第一依賴的傳遞依賴是runtime
依賴調節
常遇到的問題是,有不同版本的包,他們都存在傳遞性依賴,如下
a->b->c->x(1.0)
a->b->x(2.0)
那么此時,根據maven依賴調節第一原則最短路徑的規則,使用的x包的版本是2.0,如果當2個不同版本的包的依賴相同怎么辦?這個時候就啟動了第二原則,也就是按pom中聲明的順序,誰先被聲明,誰優先的策略去選擇包。
可選依賴
假設有 a->b,b->x和 b->y的 optional值都是true,那么a對於x和y的依賴不會被傳遞,如果a想要使用x或y的包,那么需要在a中重新進行依賴