Spring Boot2(004):关于 Build Systems (构建系统)
通过前面 3 篇的讲解,应该可以对 springboot 和创建 springboot 应用有初步的了解了(传送门如下)。
- SpringBoot2(001):入门介绍、官网参考和博客汇总
- SpringBoot2(002):手动创建第1个 SpringBoot2 简单应用——“HelloWorld” web 工程
- SpringBoot2(003):简要回顾“HelloWorld” web 工程
接下来会花一些篇幅来讲解如何使用进一步使用 springboot 的细节,例如 Build Systems (构建系统)、auto-configuration(自动装配) 、developer tools(开发者工具)等等,并且介绍如何运行 springboot 应用,还有一些推荐的 springboot 最佳实践。 本文会就 Build Systems (构建系统,本文主要是指使用 maven) 方面进行介绍,如何使用 maven 来管理和创建 SpringBoot 应用,具体可参考 13. Build Systems ,目录结构如下:
通过官方文档可以看出,Spring Boot Ref 比较建议使用 maven 或者 gradle 来进行依赖管理和应用构建。无论是哪种工具,都可以极大地方便 Java 项目中对依赖包的管理,以及项目的构建。笔者平时项目中使用的是 maven,本地环境也是用的这个。因此,对于其他的构建工具,例如 gradle(这个也很流行) 、 ant 等就不再一一赘述了。
1、Dependency Management(依赖管理)
常见的 java 项目中,除了自身项目维护的代码,都或多或少会引用内部其他项目的接口包或者第三方 jar 包,很多时候都会被这些引用包的依赖管理、版本选择、依赖冲突等,搞得焦头烂额,可能很多项目都需要确认彼此相同的引用 jar 包版本是否有冲突,是否需要排除不一致的版本、是否兼容等,稍一不慎,就很容易因版本冲突而出现应用无法启动等问题。
这种时候对于依赖包的统一版本管理就显得很重要了。maven 提供了 BOM 的功能进行依赖的统一版本管理。Spring Boot 就是使用的这个特性。 Spring Boot 的每个版本都会有相应的依赖包支持版本列表,我们开发时通常可以不用关注这些依赖版本配置(当然也可以根据需要进行指定),我们只需要知道用到哪些 jar 包,然后进行引入,无需指定版本, 而 Spring Boot 本身会对这些常见依赖进行版本管理,而且在对 spring boot 进行版本升级时相关的依赖版本也会跟着一致升级。而这个依赖包支持版本列表(包括 spring 模块和第三方依赖包)可以在 BOM (Bills of Materials,物料清单) 中查找到,BOM 可用于 maven 和 gradle。这清单很长,详情参考 springboot 的 github 链接:Bills of Materials (spring-bootdependencies) 。
注意:如果需要指定特定依赖包的版本,也可以自己指定 <version> 来覆盖默认版本。另外,Spring Boot 的每个版本都会与一个基本的 Spring Framework 版本关联,这个建议使用默认。
2、通过 Maven 使用 SpringBoot 的几种方式
Maven 用户可以通过继承 spring-boot-starter-parent 来获得预设配置,它提供了如下特性:
- 默认编译级别是 Java 1.8
- 默认 UTF-8 编码
- 获得继承自 spring-boot-dependencies pom 的依赖管理清单 Bills of Materials (spring-bootdependencies) ,里面维护了通用依赖的版本,当我们在自己的 pom 中需要使用这些依赖时,可以忽略版本 <version> 项的配置,这时候会使用默认的版本配置。
- repackage goal 执行计划
- 预设的资源过滤(resource filtering:maven-resources-plugin)
- 预设的 plugin 配置(exec plugin, Git commit ID, and shade:exec-maven-plugin、maven-git-commit-id-plugin、maven-shade-plugin)
- 预设的资源文件过滤,application.properties 和 application.yml等,还包括特定配置文件(例如:application-dev.properties 和 application-dev.yml)
注:application.properties 和 application.yml 接受的占位符是${...} ,而 maven 的是 @...@ ,可以通过 maven 属性 resource.delimiter 进行设置。
开发过程中比较关注的是依赖版本清单、application.properties [application.yml]、spring-boot-maven-plugin 等。下面介绍利用 maven 作为构建工具时使用 spring boot 的几种方式。
2.1、方式1:通过继承 Starter Parent 来使用spring boot
最简单的做法就是直接继承,在 pom.xml 中设置 parent 即可,也即常说的父 pom,这个时候只需要指定对应的 springboot 版本即可。
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
如果想要设定依赖包的版本,可以直接覆盖掉,例如,将 spring-data-releasetrain 设置为 Fowler-SR2。
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
至于 springboot 提供了哪些依赖版本管理,springboot v2.1.5.RELEASE 可以参考上面提到的 BOM :Bills of Materials (spring-bootdependencies) 。
2.2、方式2:不通过 Parent Pom 来使用 spring boot
通过继承 spring-boot-starter-parent 来使用 spring boot 很方便,继承了诸多默认配置(dependency management 和 plugin management)。当然,如果开发项目时有内部的规定或者约束来指定其他的(比如内部的)标准 parent,或者更愿意显示指定依赖的话,也可以不继承 spring-boot-starter-parent。
不继承使用 spring-boot-starter-parent 时,如果还想利用 springboot 提供的 dependency management (不是 plugin management,这个没法依赖传递),可以通过配置 scope=import 的依赖来进行管理;如下:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面的例子同样会在帮你引入默认的版本配置,如果还是需要显式指定其他的 jar 依赖版本,需要在 spring-boot-dependencies 配置之前添加,比如,这里想指定 spring-data-releasetrain 的版本为 Fowler-SR2 ,需要进行如下配置:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<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.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注:上面的例子中,我们只是指定了 BOM (Bills of Materials),任何依赖配置(包括版本)都可以被覆盖重写。
2.3、使用Spring Boot Maven Plugin 插件来生成可执行的 jar 包
springboot 包含一个 maven 插件用于将工程打包成一个可执行的 jar 包(an executable jar),只需要在 pom.xml 的 <plugins> 中添加如下配置即可
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注:使用 Spring Boot starter parent pom 时(也就是使用方式1),只需要加入上面的配置即可打包可执行的 jar 包。
3、关于 Starters
Starters(启动器)是比较方便的一组依赖关系描述符,开发者可以将其包含在应用程序中。通过 Starters 可以获得 Spring 全家桶及相关技术的一站式服务,而不必自己苦苦寻找各种相关依赖然后自己进行依赖及版本管理。例如,如果想入手使用 Spring 和 JPA 进行数据库访问,在项目中包含 spring-boot-starter-data-jpa 依赖项即可。
starters 直接包含了很多默认的依赖,开发者可以通过这一组一致的、受支持、可控的传递依赖,来快速启动和运行项目。
打个比方,Starters 就类似于一台完整的台式机,把常见的 spring 应用所需要的相关 jar 包进行了汇总维护,开箱即用,而不需要我们一个组件一个组件辛苦地找,比如CPU、内存条、硬盘、显卡等等,而且各个型号都要对上,类似于找各种 jar 包,然后版本号也要对上,然后再组装成完整的台式机来用,我们只需要使用 Starters 这个组装好的台式机,这些依赖项就都加进来了,就能快速启动和运行项目。同样,组装好的台式机是有预设的配置的,但是如果想要修改台式机中某项配置,也是可以直接更换的,但是型号(版本)要对得上才行,不过不管怎样,还是推荐原厂默认配置。
题外:关于 Starters 的命名,spring 官方提供的都是类似于 spring-boot-starter-*,* 一般表示特定的应用,这种命名方式可以方便开发者找到相关的 starters。而对于第三方的 starters ,不建议使用 spring-boot 开头,因为这是保留给 springboot 官方使用的,通常建议使用工程名称开头,比如有个第三方 starters 工程名称为 thirdpartyproject,则通常使用 thirdpartyproject-spring-boot-starter 作为 starters 的名称。例如 dubbo-spring-boot-starter。
至于 springboot 提供了哪些 starters,参考:https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/using-boot-build-systems.html#using-boot-starter
Spring Boot2(004):关于 Build Systems (构建系统)的更多相关文章
- Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...
- Spring Boot2(006):关于配置类(Configuration Classes)和配置(Configuration)
一.配置类(Configuration Classes) Spring Boot 支持基于 xml 的配置,但更偏向于使用基于 Java 的配置,通常建议使用定义有 main 方法的主 @Config ...
- Spring Boot2(005):关于代码结构
spring boot 对于工程代码结构并没有特殊得要求,但以下几个有用的最佳实践建议参考参考: 1.不鼓励而且应该避免使用 default 包 没有 package 声明的类被认为是在 defaul ...
- spring+springmvc+mybatis构建系统
今天和大家分享的是spring+springmvc+mybatis搭建框架的例子,说到这里不得不说现在市面上一流大公司还有很多用这种架子,创业型公司大部分都用springboot集成的mvc+myba ...
- SpringBoot官方文档学习(二)使用Spring Boot构建系统
强烈建议您选择一个支持依赖关系管理并且可以使用发布到“ Maven Central”仓库的构建系统.我们建议您选择Maven或Gradle.其他构建系统(例如,Ant)也可以和Spring Boot一 ...
- Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...
- C/C++构建系统 GNU autotool
我们在网上经常可以看到c/c++开源的项目,其中很多都是使用GNU的构建系统进行配置和编译的,如果按照规范构造这些的步骤,有一定的门槛和复杂度,下文把关于auotools系列的工具和概要的流程简要汇总 ...
- spring boot / cloud (三) 集成springfox-swagger2构建在线API文档
spring boot / cloud (三) 集成springfox-swagger2构建在线API文档 前言 不能同步更新API文档会有什么问题? 理想情况下,为所开发的服务编写接口文档,能提高与 ...
- spring boot2.0(一 ) 基础环境搭建
1.基础配置 开发环境:window jdk版本:1.8(spring boot2.0最低要求1.8) 开发工具:eclipse 构建方式:maven3 2.POM配置文件 <project x ...
随机推荐
- Tomcat的部署、虚拟主机及优化
Tomcat的部署.虚拟主机及优化 文章目录 Tomcat的部署.虚拟主机及优化 前言 1.Tomcat的名称由来 2.Apache Tomcat 5-7版本差异 2.1Apache Tomcat5. ...
- html弹出框播放视频
<a data-toggle="modal" data-target=".bs-example-modal-lg">模态框</a> &l ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 【快学springboot】8.JPA乐观锁OptimisticLocking
介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰 ...
- C# Stream篇(三) -- TextWriter 和 StreamWriter
TextWriter 和 StreamWriter 目录: 为何介绍TextWriter? TextWriter的构造,常用属性和方法 IFormatProvider的简单介绍 如何理解StreamW ...
- Ubuntu18.04--双显卡Nvida笔记本安装之各种问题
(1)安装 出现卡logo或者黑屏 关机重启,按住esc键或shift键不放,进入选择模式,按F6进入选择,nomodeset模式 (2)循环的登陆,或者安装好后重启无法再次进入系统 关机重启,在 ...
- 十六、JSONObject与JSONArray使用-不刷新页面做回写显示
需要导入:json-lib-2.2.2-.jar包 1.json:就是一个键对应一个值,超级简单的一对一关系.对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找. String arr ...
- Percona-Toolkit 之 pt-kill 用法
生产环境中我们时常遇到这样的情况,数据库性能恶劣,需要马上杀掉部分会话,不然数据库就夯死.我们可以先找show processlist的输出来杀会话,但是比较麻烦.pt-kill为我们解决了杀会话问题 ...
- Day1-Luogu-2085
题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...
- Centos7 下vmware NAT模式配置网络连接与DNS
NAT模式配置网络 1.首先查看NAT模式下的网络 从这边可以知道我的vmware下的nat模式的网络是192.168.109.*网段 上图这个网段也可以修改为别的网段 2.NAT模式下的网关 3.配 ...