现在基本没有人直接下载jar包手动管理依赖,都会选择使用专门的依赖构建管理系统,Java生态圈中现在比较流行的主要就是Maven和Gradle,Maven是ASF下的,历史也比较悠久,足够稳定,生态也很完善,由于个人一直在项目中用的比较多,所以依然选择使用Maven作为Spring Boot项目的构建管理系统。

一 依赖管理

Spring Boot之所以方便,原因之一就是依赖管理,它把一些常用的依赖全部给我们按照功能分类好了,直接使用就行,例如前文中我们要开发一个web应用,只需要引入对应的web功能的依赖spring-boot-starter-web就可以了,这个模块会把相关的其他web依赖按需引入进来。

另外,Spring Boot的每一个发行版都对应一个Spring Framework的版本,一般也是不建议自己指定Spring Framework的版本.

当然,如果你确实需要更换其中的某一个依赖,要换成其他的版本或实现,也是可以的。该功能其实主要是Maven自身提供的。

二 Maven构建管理系统

在上一篇文章中,我们已经用过spring-boot-starter-parent这个父pom了,该父pom文件中提供了许多特性:

  • Java 1.8 作为默认的编译级别
  • 源文件默认为UTF-8编码
  • Dependency Management,用于管理默认的依赖版本,使得我们后续的使用中不再需要指定版本号
  • 一个repackage的Maven构建目标,用于重新打包(可执行jar)
  • 自动资源过滤
  • 自动插件配置等

另外,需要特别注意的是,默认情况下,Maven和Spring配置文件中的占位符都是${…},且配置文件application.propertiesapplication.yml都支持这种占位符,所以,为了避免不必要的麻烦,Maven会被设置默认使用@..@占位符。如果你不喜欢这个,也可以自己更改,只需要提供一个Maven属性resource.delimiter即可。

2.1 继承Starter Parent

想要加入上面这些特性,只需要自己的项目继承自该pom即可,并且只需要指定该依赖的版本:

<!-- 从Spring Boot继承默认配置 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>

如果确实需要更换某一个依赖的版本,只需要显示给出该依赖的版本即可覆盖默认的版本,例如:

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
完整的属性列表见spring-boot-dependencies pom

2.2 不使用Starter Parent

有时候,继承自spring-boot-starter-parent会有一些限制,由于Maven中一个pom中的<parent>只能有一个,而像企业中一般都会有自己公司定制的<parent>,这时就无法直接继承spring-boot-starter-parent了。但是我们又想使用它提供的依赖管理怎么办?我们可以在自己的pom中通过导入的方式来使用(注意scope标签的值):

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- 从Spring Boot中导入依赖管理 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

这种情况下就不允许使用属性单独覆盖某个依赖项了,想要实现同样的效果,需要spring-boot-dependencies声明之前单独声明某个依赖,例如:

<dependencyManagement>
    <dependencies>
        <!-- 覆盖Spring Boot中提供的Spring Data releasetrain的版本 -->
        <!-- 注意顺序,要放在导入的spring-boot-dependencies之前 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

三 Starters

Starters即一系列功能模块依赖的划分,相比以前需要手动一个个将所需要的依赖引入,并且还需要确定使用哪个版本,Spring Boot提供的这种一站式解决方案确实大大加快了配置速度,并且也简化了配置。

这些Starters均以固定的格式前缀出现,后跟一个名称:
spring-boot-starter-*
其中*的部分即为名称,代表某种类型的依赖,Spring Initializr以及一些IDEs支持按这些名字进行依赖搜索。

另外,spring-boot部分作为保留前缀,代表官方的starters,第三方制作的starters不能以该前缀开头

官方完整的Spring Boot application starters列表如下:

名称描述
spring-boot-starter核心Starter,包括自动配置支持,日志和YAML
spring-boot-starter-activemqJMS之Apache ActiveMQ
spring-boot-starter-amqpSpring AMQP 和 Rabbit MQ
spring-boot-starter-aopSpring AOP 和 AspectJ
spring-boot-starter-artemisJMS之Apache Artemis
spring-boot-starter-batch用于Spring Batch
spring-boot-starter-cacheSpring Framework缓存支持
spring-boot-starter-cloud-connectorsSpring Cloud Connectors,用于简化连接到像Cloud Foundry和Heroku等云平台中的服务
spring-boot-starter-data-cassandra用于Cassandra和Spring Data Cassandra
spring-boot-starter-data-cassandra-reactive用于Cassandra和Spring Data Cassandra Reactive
spring-boot-starter-data-couchbase用于Couchbase和Spring Data Couchbase
spring-boot-starter-data-couchbase-reactive用于Couchbase和Spring Data Couchbase Reactive
spring-boot-starter-data-elasticsearch用于搜索和分析引擎Elasticsearch和Spring Data Elasticsearch
spring-boot-starter-data-jdbc用于Spring Data JDBC
spring-boot-starter-data-jpa用于使用Hibernate的Spring Data JPA
spring-boot-starter-data-ldap用于Spring Data LDAP
spring-boot-starter-data-mongodb用于MongoDB和Spring Data MongoDB
spring-boot-starter-data-mongodb-reactive用于MongoDB和Spring Data MongoDB Reactive
spring-boot-starter-data-neo4j用于图数据库Neo4j和Spring Data Neo4j
spring-boot-starter-data-redis用于键值数据存储Redis,使用Spring Data Redis 和 Lettuce 客户端
spring-boot-starter-data-redis-reactive用于键值数据存储Redis,使用Spring Data Redis Reactive 和 Lettuce 客户端
spring-boot-starter-data-rest使用Spring Data REST通过REST方式暴露Spring Data repositories
spring-boot-starter-data-solr用于搜索平台Apache Solr(使用Spring Data Solr)
spring-boot-starter-freemarker使用FreeMarker视图构建MVC web应用
spring-boot-starter-groovy-templates使用Groovy模板视图构建MVC web应用
spring-boot-starter-hateoas借助Spring MVC 和 Spring HATEOAS构建hypermedia-based RESTful web应用
spring-boot-starter-integration用于Spring Integration
spring-boot-starter-jdbc用于使用HikariCP连接池的JDBC
spring-boot-starter-jersey用于使用JAX-RS和Jersey构建RESTful web应用,spring-boot-starter-web的备选方案
spring-boot-starter-jooq用于使用jOOQ访问SQL数据库,spring-boot-starter-data-jpaspring-boot-starter-jdbc的备选方案
spring-boot-starter-json用于读写json
spring-boot-starter-jta-atomikos使用Atomikos的JTA事务
spring-boot-starter-jta-bitronix使用Bitronix的JTA事务
spring-boot-starter-mailJava Mail 和 Spring Framework的邮件发送支持
spring-boot-starter-mustache使用Mustache视图构建web应用
spring-boot-starter-oauth2-clientSpring Security的 OAuth2/OpenID Connect客户端特性
spring-boot-starter-oauth2-resource-serverSpring Security的 OAuth2 资源服务端特性
spring-boot-starter-quartz使用Quartz调度框架
spring-boot-starter-security使用Spring Security
spring-boot-starter-test使用JUnit,Hamcrest 和 Mockito测试Spring Boot应用
spring-boot-starter-thymeleaf用Thymeleaf视图构建MVC web应用
spring-boot-starter-validation借助Hibernate Validator的Java Bean验证
spring-boot-starter-web构建web应用,包括RESTful,Spring MVC应用,默认使用Tomcat作为内嵌容器
spring-boot-starter-web-services用于Spring Web Services
spring-boot-starter-webflux借助Spring Framework的 Reactive Web支持来构建WebFlux应用
spring-boot-starter-websocket借助Spring Framework的 WebSocket支持来构建WebSocket应用

另外,除了上述应用starters,还有一个用于生产监控的starter:

名称描述
spring-boot-starter-actuator借助Spring Boot的 Actuator 提供监控和管理应用的生产级特性

其他一些可选技术方案:

名称描述
spring-boot-starter-jetty使用Jetty作为内嵌Servlet容器,spring-boot-starter-tomcat的备选方案
spring-boot-starter-log4j2Log4j2,spring-boot-starter-logging的备选方案
spring-boot-starter-loggingLogback,默认日志starter
spring-boot-starter-reactor-netty使用Reactor Netty 作为内嵌的 reactive HTTP 服务器
spring-boot-starter-tomcat使用Tomcat作为内嵌Servlet容器,spring-boot-starter-web默认使用的容器
spring-boot-starter-undertow使用Undertow作为内嵌Servlet容器,spring-boot-starter-tomcat的备选方案

第三方Starters:
community contributed starters

参考:
https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-build-systems.html

文章目录