Spring Boot学习 二 构建管理
现在基本没有人直接下载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.properties
和application.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-activemq | JMS之Apache ActiveMQ |
spring-boot-starter-amqp | Spring AMQP 和 Rabbit MQ |
spring-boot-starter-aop | Spring AOP 和 AspectJ |
spring-boot-starter-artemis | JMS之Apache Artemis |
spring-boot-starter-batch | 用于Spring Batch |
spring-boot-starter-cache | Spring Framework缓存支持 |
spring-boot-starter-cloud-connectors | Spring 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-jpa 或spring-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-mail | Java Mail 和 Spring Framework的邮件发送支持 |
spring-boot-starter-mustache | 使用Mustache视图构建web应用 |
spring-boot-starter-oauth2-client | Spring Security的 OAuth2/OpenID Connect客户端特性 |
spring-boot-starter-oauth2-resource-server | Spring 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-log4j2 | Log4j2,spring-boot-starter-logging 的备选方案 |
spring-boot-starter-logging | Logback,默认日志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
版权声明:知识共享署名-非商用-非衍生 (CC BY-NC-ND 3.0) 转载请注明出处