spring-boot-03 Spring Boot的依赖是如何管理的?如何迅速创建一个Spring Boot项目?(pom.xml详解,spring boot starter详解)

转载请注明来源 赖赖的博客

导语

深入一点,迷惑就少一点。

本节接着spring-boot-02,主要目的是为了了解项目的依赖方面,具体的说也就是pom.xml(我使用 maven进行依赖管理)
如果你不熟悉maven建议可以先去熟悉一下,否则以下内容可能会比较难懂,当然也可以一边看一边查找相关内容,并不是很复杂。

实例

项目工程目录结构和代码获取地址

获取地址(TAG将会注明不同版本对应的课程)

https://github.com/laiyijie/Spring-Boot-Learning

本节示例请参考 spring-boot-02

项目详解

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>

核心点是两部分,一个是<parent>标签,一个是<dependency>标签

我们不妨从 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>

我使用......来代替一些现在不关注的内容,我们可以看到 spring-boot-starter-parent-1.5.4.RELEASE.pom 做了这么四件事情:

  1. 继承了spring-boot-dependencies(我们等下再来看这是个什么东西)
  2. 增加了一个依赖管理(dependencyManagement),只管理了spring-core的版本
  3. 配置资源的解析(resource),具体作用可以参考这里
  4. 配置了maven插件管理(pluginManagement)这里暂不赘述

那么spring-boot-dependencies是个啥呢?

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. 增加了一个依赖管理(dependencyManagement),管理了常用的版本
  2. 配置资源的解析(resource),具体作用可以参考这里
  3. 配置了maven插件管理(pluginManagement)以及增加了一些插件(这里暂不赘述)

也就是在<parent>这个标签中,我们没有引入任何依赖只引入了一些依赖管理

明白了<parent>所做的事情,也就很容易理解为什么spring官方文档会墙裂推荐这种引入方式,因为很简单的就完成了上述的三件事情,否则要通过比较复杂的方式实现这种功能(分别在 依赖管理,插件管理,插件引入这个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>

你可以认为只做了一件事:

  1. 增加了创建一个web程序所需要的依赖,而且这些依赖的版本早已经在parent继承的时候就被确认了,所以我们在引入这个依赖的时候并不需要写版本号!

但是目前看起来还是很复杂,因为我们对spring-boot-starter-webspring-boot-dependenciesspring-boot-starter-parent之间的关系并不清晰!所以我画了一张图

spring-boot常用pom之间的依赖关系图

spring-boot-starter依赖关系图

以下讨论暂时忽略对maven插件的管理(plugin和pluginMangement)

  1. spring-boot-dependencies 是依赖管理(dependencyManagement)
  2. spring-boot-starter-parent 增加了必要的资源处理(对application.properties和application.yaml进行了转义)
  3. spring-boot-starters 集合了所有的spring-boot-starter-xxx
  4. spring-boot-starter-xxx 真正定义了所有的依赖

你还在害怕继承 spring-boot-starter-parent会造成什么不必要的影响吗?不妨看看源码吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容