一、什麼是 pom?
POM
是 Project Object Model
的縮寫,即項目對象模型。
pom.xml
就是 maven
的配置文件,用以描述項目的各種信息。
<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>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
1. relativePath
默認值爲../pom.xml
查找順序:relativePath
元素中的地址→本地倉庫→遠程倉庫
設定一個空值將始終從倉庫中獲取,不從本地路徑獲取。
如:
<relativePath/>
2. dependencyManagerment
首先,該標籤裏面的依賴不會被子模塊直接繼承。若是不加這個標籤,則父pom
裏面的 所有依賴 都會被子模塊直接繼承過去,若子模塊不需要使用全部的依賴,你卻強制給子模塊,子模塊打包時會因爲多餘的jar
包顯得很臃腫。
一般做法是:
在父pom
的<dependencyManagerment>
標籤裏面聲明所有的依賴及其版本號,可以用<properties>
標籤進一步對版本號進行集中管理。子模塊若想使用父pom
中聲明的依賴,需要在自己的模塊中聲明一下,但不用寫版本號(當子模塊繼承了父pom
後,會默認向上找父pom
中<dependencyManagerment>
標籤中依賴聲明的版本號;若子模塊中寫了版本號,就優先使用自己的版本號)。這樣子模塊用什麼依賴就取什麼依賴即可,父pom
也可以對所有的依賴進行統一的管理。
3.
二、Maven依賴中scope詳解
scope元素的作用:控制 dependency 元素的使用範圍。通俗的講,就是控制 Jar 包在哪些範圍被加載和使用。
scope的默認值是compile。
compile
默認就是compile,什麼都不配置也就是意味着compile。compile表示被依賴項目需要參與當前項目的編譯,當然後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。
test
scope爲test表示依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯,執行。比較典型的如junit。
runntime
runntime表示被依賴項目無需參與項目的編譯,不過後期的測試和運行週期需要其參與。與compile相比,跳過編譯而已,說實話在終端的項目(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope爲runntime。另外runntime的依賴通常和optional搭配使用,optional爲true。我可以用A實現,也可以用B實現。
provided
provided意味着打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,運行等週期。相當於compile,但是在打包階段做了exclude的動作。
system
從參與度來說,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地文件系統拿,一定需要配合systemPath屬性使用。
scope的依賴傳遞
A–>B–>C。當前項目爲A,A依賴於B,B依賴於C。知道B在A項目中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。
三、spring-boot- maven-plugin插件作用
spring-boot-maven-plugin
這個插件是專門爲springBoot
項目服務的。
作用是打包時,對mvn package
打包後的結果進行二次打包,目的是將當前項目所有的依賴也打包進來(會自動的找到啓動類作爲main class
),官方解釋此時的jar
包叫fat.jar
。若不加這個插件,就只打包當前項目中的東西,依賴不會被打包進來。
注意:
spring-boot-maven-plugin
打成的jar
包可以運行,但是不能被其他工程依賴。所以被其他模塊依賴的模塊如common
模塊,不能加這個,否則會提示找不到程序包。