bigywater.tech
Spring · 66

starter 到底做了什么

starter 里到底有什么?为什么加一个依赖就多出一个 Web 服务器?各个 starter 拉来多少 jar?这篇直接解析依赖、打开 starter 的 jar、对比同一份启动代码在不同类路径下的差别。

0 个
starter-webmvc / starter-data-jpa 的 jar 里 .class 文件的个数
39 / 65
starter-webmvc 与 starter-webflux 拉来的 jar 个数
50 → 143
同一份启动代码,类路径加上 starter-webmvc 之后的 Bean 总数

依赖量

实测 · 本机执行输出
  spring-boot-starter                 21 个 jar,共   8.4 MB;其中 spring-boot-* 模块 2 个,starter 自身 2 个
  spring-boot-starter-webmvc          39 个 jar,共  18.7 MB;其中 spring-boot-* 模块 8 个,starter 自身 6 个
  spring-boot-starter-webflux         65 个 jar,共  33.6 MB;其中 spring-boot-* 模块 9 个,starter 自身 5 个
  spring-boot-starter-data-jpa        55 个 jar,共  40.3 MB;其中 spring-boot-* 模块 10 个,starter 自身 4 个
  spring-boot-starter-security        28 个 jar,共  14.2 MB;其中 spring-boot-* 模块 3 个,starter 自身 3 个
  spring-boot-starter-actuator        32 个 jar,共  10.4 MB;其中 spring-boot-* 模块 7 个,starter 自身 4 个
  spring-boot-starter-validation      28 个 jar,共  10.2 MB;其中 spring-boot-* 模块 3 个,starter 自身 3 个
  spring-boot-starter-test            50 个 jar,共  23.2 MB;其中 spring-boot-* 模块 4 个,starter 自身 3 个

不同的 starter 拉来的依赖数量差别很大。

jar 内容

实测 · 本机执行输出
  spring-boot-starter-webmvc-4.0.8.jar:共 4 个条目,其中 .class 文件 0 个,大小 4749 字节;条目 = ['META-INF/MANIFEST.MF', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt']
  spring-boot-starter-data-jpa-4.0.8.jar:共 4 个条目,其中 .class 文件 0 个,大小 4761 字节;条目 = ['META-INF/MANIFEST.MF', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt']

starter 本身没有代码,只有 pom。

pom

实测 · 本机执行输出
  org.springframework.boot:spring-boot-starter  compile
  org.springframework.boot:spring-boot-starter-jackson  compile
  org.springframework.boot:spring-boot-starter-tomcat  compile
  org.springframework.boot:spring-boot-http-converter  compile
  org.springframework.boot:spring-boot-webmvc  compile

直接依赖几个模块,自动配置在模块里。

效果

实测 · 本机执行输出
  类路径 = spring-boot-starter:应用类型 = NONE,Bean 总数 = 50,类路径上有 DispatcherServlet = false,有 Tomcat 的 Bean = false,启动用时 348 ms
  类路径 = spring-boot-starter-webmvc:应用类型 = SERVLET,Bean 总数 = 143,类路径上有 DispatcherServlet = true,有 Tomcat 的 Bean = true,启动用时 692 ms

类路径变了,自动配置就跟着变。

分步演示

starter
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动。依赖解析用 Maven 对 Boot 4.0.8 的 BOM 解析出完整 classpath,jar 个数与大小是本机解析结果;starter pom 取自本地仓库;最后一节是单次运行,启动用时没有重复测量
    • 没有验证:starter 依赖的 exclude 写法;第三方 starter 的命名约定(xxx-spring-boot-starter);optional 依赖对 classpath 的影响;Gradle 下的差别;jar 数里重复或版本冲突的情形;启动用时的多次重复测量
    京ICP备2026067502号-1京公网安备11010502063487号