spring-boot-03 Spring Boot的依賴是如何管理的?如何迅速創(chuàng)建一個(gè)Spring Boot項(xiàng)目龄寞?(pom.xml詳解汰规,spring boot starter詳解)

轉(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 做了這么四件事情:

  1. 繼承了spring-boot-dependencies(我們等下再來看這是個(gè)什么東西)
  2. 增加了一個(gè)依賴管理(dependencyManagement)票唆,只管理了spring-core的版本
  3. 配置資源的解析(resource)朴读,具體作用可以參考這里
  4. 配置了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>

做了如下幾件事:

  1. 增加依賴管理(dependencyManagement)
  2. 增加maven插件管理(pluginManagement)
  3. 增加maven插件(plugins)

這樣的話走趋,我們可以綜合起來看衅金,
spring-boot-starter-parent-1.5.4.RELEASE.pom 做了這么3件事情

  1. 增加了一個(gè)依賴管理(dependencyManagement),管理了常用的版本
  2. 配置資源的解析(resource),具體作用可以參考這里
  3. 配置了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)為只做了一件事:

  1. 增加了創(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-dependenciesspring-boot-starter-parent之間的關(guān)系并不清晰!所以我畫了一張圖

spring-boot常用pom之間的依賴關(guān)系圖

spring-boot-starter依賴關(guān)系圖

以下討論暫時(shí)忽略對(duì)maven插件的管理(plugin和pluginMangement)

  1. spring-boot-dependencies 是依賴管理(dependencyManagement)
  2. spring-boot-starter-parent 增加了必要的資源處理(對(duì)application.properties和application.yaml進(jìn)行了轉(zhuǎn)義)
  3. spring-boot-starters 集合了所有的spring-boot-starter-xxx
  4. spring-boot-starter-xxx 真正定義了所有的依賴

你還在害怕繼承 spring-boot-starter-parent會(huì)造成什么不必要的影響嗎椰棘?不妨看看源碼吧造垛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晰搀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌办斑,老刑警劉巖外恕,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乡翅,居然都是意外死亡鳞疲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蠕蚜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尚洽,“玉大人,你說我怎么就攤上這事靶累∠俸粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵挣柬,是天一觀的道長(zhǎng)潮酒。 經(jīng)常有香客問我,道長(zhǎng)邪蛔,這世上最難降的妖魔是什么急黎? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上勃教,老公的妹妹穿的比我還像新娘淤击。我一直安慰自己,他們只是感情好故源,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布污抬。 她就那樣靜靜地躺著,像睡著了一般心软。 火紅的嫁衣襯著肌膚如雪壕吹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天删铃,我揣著相機(jī)與錄音耳贬,去河邊找鬼。 笑死猎唁,一個(gè)胖子當(dāng)著我的面吹牛咒劲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诫隅,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼腐魂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了逐纬?” 一聲冷哼從身側(cè)響起蛔屹,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豁生,沒想到半個(gè)月后兔毒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甸箱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年育叁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芍殖。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豌骏,到底是詐尸還是另有隱情龟梦,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布肯适,位于F島的核電站变秦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏框舔。R本人自食惡果不足惜蹦玫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一赎婚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧樱溉,春花似錦挣输、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖帘,卻和暖如春完丽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拇舀。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工逻族, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骄崩。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓聘鳞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親要拂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抠璃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容