springboot項目的pom文件中,我們經常看見這樣(下圖)兩種springboot的版本依賴管理方式;圖片中的這兩種依賴聲明方式任意用其中一種都可以。文章后面會簡單闡述一下區別和使用場景。
事例中完整的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zhh.platform</groupId><artifactId>demo2</artifactId><version>0.0.1-SNAPSHOT</version><name>demo2</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 聲明依賴 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version></parent><!-- 聲明依賴 --><!-- <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.13</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.zhh.platform.Demo2Application</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
1. 兩者的區別和作用
?spring-boot-starter-parent繼承了spring-boot-dependencies,打開spring-boot-starter-parent的pom文件就能看見他的父級就是spring-boot-dependencies,不過他多了一些配置,比如配置了UTF-8編碼格式,如果我們繼承了spring-boot-starter-parent,就可以不用再配置編碼格式,否則還是需要配置一下
下面是spring-boot-dependencies的pom文件部分截圖
他提供了相關的默認版本依賴,使用它之后,常用的包依賴可以省去version標簽,例如:
在使用過程中,如果用的是spring-boot-starter-parent,一般會把他寫在parent標簽中;如果用的是spring-boot-dependencies,一般會把他寫在dependencyManagement標簽中,例如:
<!-- 聲明依賴 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version></parent><!-- 兩者選擇其一,另一個注釋掉 --><!-- 聲明依賴 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.13</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
其實反過來寫也可以,不過還是不要獨行特立,例如:
<!-- 聲明依賴 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.13</version></parent><!-- 兩者選擇其一,另一個注釋掉 --><!-- 聲明依賴 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
上面說到了兩種聲明父依賴的方式分別是在<parent>標簽和<dependencyManagement>標簽中聲明,有什么區別呢?
2.?parent標簽和dependencyManagement標簽中聲明父依賴的區別
<parent>標簽只支持單繼承,如果需要多個父級,就需要用到dependencyManagement標簽。
假如我們現在要添加 spring-boot-starter-web 依賴,我們是不需要聲明版本的,
但是如果現在我們需要添加 spring-cloud-starter-gateway 依賴,你會發現,如果不聲明版本根本就不行,因為spring-cloud-starter-gateway是springCloud的相關依賴,他在spring-boot-starter-parent的父級spring-boot-dependencies中根本就沒有對應的版本聲明,這個時候如果不想自己聲明版本,就需要在dependencyManagement標簽中添加spring-cloud-dependencies的聲明,spring-cloud-dependencies的pom文件中聲明了springcloud相關依賴的版本
在使用過程中,如果需要多個父依賴,就需要用到dependencyManagement標簽,可以一個父依賴在parent標簽中,其他的父依賴在dependencyManagement標簽中,也可以都在dependencyManagement標簽中。
如果只有一個父依賴,可以在dependencyManagement標簽中聲明,也可以在parent標簽中聲明。
隨便理一下dependencyManagement標簽和dependencies標簽的區別
a.dependencyManagement標簽
dependencyManagement標簽可以理解成一個maven中的依賴管理器,他只聲明不引入。在maven多模塊項目(父子工程)中,一般都是在dependencyManagement標簽中聲明所有需要的依賴,然后子模塊中只需要添加相應的groupId和artifactId即可,并不需要聲明版本號。這樣做的目的是為了方便jar包版本的統一管理,如果需要修改jar依賴的版本,只需要修改父pom一個地方即可。
?
b. dependencies標簽
?
dependencies標簽中引入了一個jar包之后,如果沒有加上version版本號的話,那么maven就會去<dependencyManagement>里找對應groupId和artifactId的聲明并使用對應的版本號,先在當前pom文件的dependencyManagement標簽中找,如果沒有,就到父模塊的dependencyManagement標簽中找,都沒有就報錯。