轉(zhuǎn)載請(qǐng)注明來源 賴賴的博客
導(dǎo)語
深入一點(diǎn),迷惑就少一點(diǎn)物邑。
本節(jié)接著spring-boot-02溜哮,主要目的是為了了解項(xiàng)目的依賴方面,具體的說也就是pom.xml(我使用 maven進(jìn)行依賴管理)
如果你不熟悉maven建議可以先去熟悉一下色解,否則以下內(nèi)容可能會(huì)比較難懂茂嗓,當(dāng)然也可以一邊看一邊查找相關(guān)內(nèi)容,并不是很復(fù)雜冒签。
實(shí)例
項(xiàng)目工程目錄結(jié)構(gòu)和代碼獲取地址
獲取地址(TAG將會(huì)注明不同版本對(duì)應(yīng)的課程)
https://github.com/laiyijie/Spring-Boot-Learning
本節(jié)示例請(qǐng)參考 spring-boot-02
項(xiàng)目詳解
pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.laiyijie</groupId>
<artifactId>spring-boot-learning</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
核心點(diǎn)是兩部分在抛,一個(gè)是<parent>
標(biāo)簽,一個(gè)是<dependency>
標(biāo)簽
我們不妨從 spring-boot-starter-parent 入手萧恕,看看它到底是啥刚梭。
parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
spring-boot-starter-parent-1.5.4.RELEASE.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
......
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
......
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- Turn on filtering by default for application properties -->
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
<pluginManagement>
......
</pluginManagement>
</build>
</project>
我使用......
來代替一些現(xiàn)在不關(guān)注的內(nèi)容,我們可以看到 spring-boot-starter-parent-1.5.4.RELEASE.pom 做了這么四件事情:
- 繼承了
spring-boot-dependencies
(我們等下再來看這是個(gè)什么東西) - 增加了一個(gè)依賴管理(dependencyManagement)票唆,只管理了spring-core的版本
- 配置資源的解析(resource)朴读,具體作用可以參考這里
- 配置了maven插件管理(pluginManagement)這里暫不贅述
那么spring-boot-dependencies
是個(gè)啥呢?
spring-boot-dependencies-1.5.4.RELEASE.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.4.RELEASE</version>
<packaging>pom</packaging>
......
<properties>
<!-- Dependency versions -->
<activemq.version>5.14.5</activemq.version>
......
<versions-maven-plugin.version>2.2</versions-maven-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
......
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
......
</pluginManagement>
<plugins>
......
</plugins>
</build>
</project>
做了如下幾件事:
- 增加依賴管理(dependencyManagement)
- 增加maven插件管理(pluginManagement)
- 增加maven插件(plugins)
這樣的話走趋,我們可以綜合起來看衅金,
spring-boot-starter-parent-1.5.4.RELEASE.pom 做了這么3件事情
- 增加了一個(gè)依賴管理(dependencyManagement),管理了常用的版本
- 配置資源的解析(resource),具體作用可以參考這里
- 配置了maven插件管理(pluginManagement)以及增加了一些插件(這里暫不贅述)
也就是在<parent>
這個(gè)標(biāo)簽中氮唯,我們沒有引入任何依賴鉴吹!只引入了一些依賴管理!
明白了<parent>
所做的事情惩琉,也就很容易理解為什么spring官方文檔會(huì)墻裂推薦這種引入方式豆励,因?yàn)楹芎?jiǎn)單的就完成了上述的三件事情,否則要通過比較復(fù)雜的方式實(shí)現(xiàn)這種功能(分別在 依賴管理瞒渠,插件管理良蒸,插件引入這個(gè)pom)。
dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<artifactId>spring-boot-starter-web</artifactId>
......
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
......
</dependencies>
</project>
你可以認(rèn)為只做了一件事:
- 增加了創(chuàng)建一個(gè)web程序所需要的依賴伍玖,而且這些依賴的版本早已經(jīng)在
parent
繼承的時(shí)候就被確認(rèn)了嫩痰,所以我們?cè)谝脒@個(gè)依賴的時(shí)候并不需要寫版本號(hào)!
但是目前看起來還是很復(fù)雜窍箍,因?yàn)槲覀儗?duì)spring-boot-starter-web
串纺、spring-boot-dependencies
和spring-boot-starter-parent
之間的關(guān)系并不清晰!所以我畫了一張圖
spring-boot常用pom之間的依賴關(guān)系圖
以下討論暫時(shí)忽略對(duì)maven插件的管理(plugin和pluginMangement)
- spring-boot-dependencies 是依賴管理(dependencyManagement)
- spring-boot-starter-parent 增加了必要的資源處理(對(duì)application.properties和application.yaml進(jìn)行了轉(zhuǎn)義)
- spring-boot-starters 集合了所有的spring-boot-starter-xxx
- spring-boot-starter-xxx 真正定義了所有的依賴
你還在害怕繼承 spring-boot-starter-parent會(huì)造成什么不必要的影響嗎椰棘?不妨看看源碼吧造垛!