阿里云发布SpringBoot新脚手架工程

更新时间:2023-05-14 00:08:05 阅读: 评论:0

阿⾥云发布SpringBoot新脚⼿架⼯程
背景
相信很多⼈都使⽤过 start.spring.io 来初始化⾃⼰的 Spring Boot ⼯程,这个⼯具为开发者提供了丰富的可选组件,并且可以选择多种打包⽅式,⼤⼤⽅便了开发⼈员的使⽤。最近,阿⾥的 Nacos、Sentinel 也进⼊ start.spring.io 的选项中,进⼀步的⽅便开发者使⽤阿⾥云的产品。
但是,⽣成的⼯程⾻架中,只有组件坐标信息,缺少对应的使⽤⽅法和 Demo 代码;于是,开发者还是需要去寻找相关使⽤教程,或者样例代码;如果找的不对,或者是版本不匹匹配,还需要花费不少时间去排查和解决问题;这些问题都在⽆形中增加⽤户的⼯作量。
我们将对软件⼯程的抽象层次⾃上⽽下进⾏切分,会得到如下的⼏个层级:⾏业、解决⽅案、应⽤、功能、组件;明显的,start.spring.io ⽬前只能提供组件级别的⽀持。再将组件这层展开,会发现这样⼀个⽣命周期:组件引⼊、组件配置、功能开发、线上运维。start.spring.io 也只实现了“组件引⼊”这⼀功能。
我们的⽬标是“让阿⾥云成为⼴⼤ Java 开发者最好⽤的云”。要实现这个⽬标,是否可以再向前⾛⼏步,在解决“组件引⼊”问题的基础上,将组件的典型使⽤⽅法、样例代码、使⽤说明也加⼊到⼯程中呢?
基于这种思考,我们上线了⾃⼰的 bootstrap 站点 :
当然,本着不重复造轮⼦的原则,我们不再构建⼀套⼯程⽣成底层框架,⽽是使⽤ Spring Initializr 来实现这部分功能。在此之上专注于增加新特性,实现服务⼴⼤开发者的⽬标。
在 中,我们为⼴⼤开发者带来了如下便利特性:
为每个组件提供了单独的 DemoCode 和对应的配置样例(本次已发布);
⼯程内置说明,减少⽤户查找⽂档的困难(部分实现);除夕年夜饭
开发者只需要做减法,⽽⾮加法的使⽤⽅式(部分实现);
提供多组件集成的解决⽅案(开发中);
定期跟进 start.spring.io 的更新,⽅便⼤家使⽤到 spring 的最新功能。
未来,我们还需要再助⼒开发者这条路上继续发⼒,不仅仅是做好组件集成的⼯作,还要需要继续向上⽀持,提供更多功能、服务、应⽤层级的快速构建能⼒。
本⽂,围绕 spring initializr 框架,以 start.spring.io 为例,全⾯的给⼤家介绍如何使⽤和扩展这个框架,以及背后的运⾏原理。
使⽤篇
由于 spring-initializr 提供了灵活的扩展能⼒,以及丰富的默认实现;其使⽤⽅式也是⾮常的灵活多变;为了便于说明,我们直接通过 start.spring.io ,看看 Spring ⾃⼰是怎么使⽤这套框架的。
1. 基本⽤法
基本⽤法的原则,是尽量少写代码,甚⾄是不写代码。只通过配置就可以实现 initializr ⼯程的创建。
依赖引⼊
要使⽤ spring-initializr ,⾸先要引⼊这套框架。很简单,直接依赖 bom 即可:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-bom</artifactId>
弓箭图片
洋桔梗怎么养<version>0.9.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
有了这个 bom 依赖,我们就不⽤再关⼼内部组件的版本等信息了。
⼀般来说,我们还需要引⼊具体组件:
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-generator-spring</artifactId>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-version-resolver</artifactId>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-web</artifactId>
</dependency>
具体每个⼦模块的⽤途,这⾥列出来,供读者参考:
initializr-actuator: 监控诊断的附加信息,这个暂时忽略;
initializr-bom: 便于外部使⽤的bom依赖;
initializr-docs: 使⽤⽂档;
initializr-generator: 核⼼⼯程⽣成库;
initializr-generator-spring: ⽤于⽣成典型的spring boot⼯程;
initializr-generator-test: 测试框架;
initializr-metadata: 项⽬各个⽅⾯的元数据基础结构;
initializr-rvice-sample: 基本使⽤案例;
initializr-version-resolver:版本号解析能⼒;
initializr-web: 提供给三⽅客户端使⽤的web⼊⼝。
基本配置
完成了框架引⼊,就需要做⼀些基础配置了⽀持哪些语⾔:Java、groovy、Kotlin⽀持哪些版本:1.8、11、13⽀持哪些打包⽅式:jar、war
将这些信息全部配置到 l ⽂件中,如下:
完成了框架引⼊,就需要做⼀些基础配置了
⽀持哪些语⾔:Java、groovy、Kotlin
⽀持哪些版本:1.8、11、13
⽀持哪些打包⽅式:jar、war
initializr:
packagings:
- name: Jar
id: jar
default: true
- name: War
id: war
default: fal
javaVersions:
- id: 13
default: fal
- id: 11
name: 8
default: true
languages:
- name: Java
id: java
default: true
- name: Kotlin
id: kotlin
default: fal
- name: Groovy
id: groovy
default: fal
分享的故事其中 name 是可选的, id 是必填的。
每个配置项下,可以有⼀个默认值(将 default 这是为 true 即可),除了这些基本配置,我们还需要定义可以⽀持的项⽬类型:
initializr:
types:军费支出
- name: Maven Project
id: maven-project
description: Generate a Maven bad project archive.
tags:
build: maven
format: project
default: true
action: /starter.zip
- name: Maven POM
id: maven-build
description: Generate a l.
tags:
build: maven
format: build
default: fal
action: /l
- name: Gradle Project
id: gradle-project
description: Generate a Gradle bad project archive.
tags:
build: gradle
format: project
default: fal
action: /starter.zip
-
name: Gradle Config
id: gradle-build
description: Generate a Gradle build file.
tags:
build: gradle
format: build
default: fal
action: /adle
默认情况下, initializr 已经⽀持 4 种项⽬类型:
/l ⽣成⼀个 Maven 的 l 配置⽂件
/adle ⽣成 Gradle 的配置⽂件
/
starter.zip ⽣成 zip ⽅式压缩的⼯程⽂件
/ ⽣成以 tgz ⽅式压缩的⼯程⽂件
通过 tags 标签,我们可以定义不同配型的编译⽅式 (build) 和打包格式(format)。
配置基本依赖
完成了基本配置以后,就可以配置可选的依赖组件了。
依赖配置以 dependency 为 key ,同样配置在 l 的 initializr 下⾯,这⾥给出⼀个简单的样例:
initializr:
dependencies:
- name: Web
content:
description: Full-stack web development with Tomcat and Spring MVC
- name: Developer Tools
content:
- name: Spring Boot DevTools
id: devtools
groupId: org.springframework.boot
artifactId: spring-boot-devtools
description: Provides fast application restarts, LiveReload, and configurations for enhanced development experience.
- name: Lombok
id: lombok
groupId: org.projectlombok
河源旅游artifactId: lombok
description: Java annotation library which helps to reduce boilerplate code.
共同利益dependencies 下定义分组。分组的作⽤是便于展⽰和快速查找,所以不需要 id ,只需要 name 信息;每个分组的 content 是分组的具体内容,也就是这个分组下的组件定义;⽀持以列表形式定义多个;另外,每个分组都可以设置当前分组内组件公⽤的配置信息。
每⼀依赖,包含如下的基本信息:
id:组件的唯⼀标识符
groupId & artifactId:组件的坐标
name:显⽰名称
description:描述信息,主要⽤于展⽰⽤途
version:组件版本
关于 groupId & artifactId:如果设置了坐标,⽣成的项⽬⾥会使⽤这⾥的坐标定位组件;但是如果没有设置坐标,框架会认为这是⼀个标准的 spring-boot 组件,⾃动添加 spring-boot-starter-{id} 作为⽣成的依赖坐标。
关于 version:如果直接在组件上设置版本信息,框架会直接使⽤这个值作为组件依赖的版本;但是很多时候,组件的版本会受到 spring-boot 版本的影响,此时就需要对版本做特殊的定义 & 管理。
配置依赖版本管理
这⾥需要先了解⼀下版本命名规则:⼀个典型的版本,⼀般包含如下 4 个信息:⼤版本、⼩版本、修正版本、版本限定符。
版本范围有⼀个上界和下界,可以⽅括号 [] 或者圆括号 () 表⽰。⽅括号代表上下界的闭区间,圆括号代表上下界的开区间。
例如:“[1.1.6.RELEASE,1.3.0.M1)”代表所有从 1.1.6.RELEASE 到 1.3.0.M1 之间所有的版本(包含 1.1.6.RELEASE ,但不包含 1.3.0.M1 )。
同时,可以使⽤单⼀版本号作为版本范围,例如 “1.2.0.RELEASE”。单⼀版本号的版本范围代表“从这个版本以及之后的所有版本”。
如果需要使⽤“最新的 Relea 版本”的概念,可以使⽤⼀个字母 x 代表具体的版本号。
例如, BUILD-SNAPSHOT 代表 1.4.x 的最新快照版本。
再⽐如:如果需要表达,从 1.1.0.RELEASE 到 1.3.x 之间的所有版本,可以⽤[1.1.0.RELEASE,RELEASE]来表达。
另外,版本限定符也是有顺序的(升序):
M:⾥程碑版本
RC:发布候选版本
RELEASE:发布版本
BUILD-SNAPSHOT:为开发构建的快照版本
所以快照版本是所有限定符⾥优先级最⾼的。假设某个组件需要 Spring Boot 的最新版本,可以使⽤ BUILD-SNAPSHOT (假设 1.5 版是 Spring Boot 的最新版本)。
最后,版本范围中讨论的版本,指的都是 Spring Boot的版本,⽽不是组件⾃⼰的版本。
前⾯介绍了,可以使⽤ version 属性定义组件的具体版本号;但是,如果组件版本与Spring Boot 的版本存在关联关系,就需要使⽤ compatibilityRange 来配置依赖的版本范围。
compatibilityRange 可以定义在两个地⽅:
直接定义在组件(或 Bom )上
这种定义⽅式,代表组件只⽀持 Spring Boot 的某⼀个版本范围,例如下⾯的配置:
initializr:
dependencies:
- name: Stuff
content:
- name: Foo
id: foo
...
compatibilityRange: 1.2.0.M1
-
name: Bar
id: bar
...
compatibilityRange: "[1.5.0.RC1,2.0.0.M1)"
Foo 可以⽀持 Spring boot 1.2.0 之后的所有版本;⽽Bar只能⽀持 Spring Boot 1.5.0 到 2.0.0 之间的版本,且不包含 2.0.0 ;定义在组件的 mappgin 属性下
可以⽀持在 Spring Boot 不同版本之下对组件做不同的设置(可以重置组件部分或者是所有的属性),下⾯的例⼦中对artifactId 做了特殊定义:
initializr:
dependencies:
- name: Stuff
content:
- name: Foo
id: foo
groupId: org.acme.foo
artifactId: foo-spring-boot-starter
compatibilityRange: 1.3.0.RELEASE
mappings:
- compatibilityRange: "[1.3.0.RELEASE,RELEASE]"
artifactId: foo-starter
- compatibilityRange: "1.4.0.RELEASE"
这个例⼦中, foo 在 Spring Boot 的 1.3 使⽤ foo-starter 作为坐标的 artifactId ;在 1.4.0.RELEASE 以及之后的版本中,还是使⽤ foo-spring-boot-starter 作为 artifactId 的值;
使⽤ Bom 管理版本:有时候,需要使⽤ Bom 的⽅式管理组件版本;此时不需要对组件单独设置版本号。
要使⽤ Bom ,⾸先要配置 Bom 定义:
initializr:
env:
boms:
my-api-bom:
groupId: org.acme
artifactId: my-api-dependencies
version: 1.0.0.RELEASE
repositories: my-api-repo-1
天生我有才
注意:Bom 信息,定义在 v.boms下⾯。
其属性和依赖组件基本⼀致,都是坐标、版本;同时, Bom 也⽀持版本范围管理。
完成了 Bom 的定义,就需要在组件中引⽤ Bom :
initializr:
dependencies:
- name: Other
content:
- name: My API
id : my-api
groupId: org.acme
artifactId: my-api
bom: my-api-bom
⼀旦⽤户选择了 my-api 组件,框架会⾃动为⽣成的项⽬添加了 my-api-dependencies 的 Bom 依赖;
2. ⾼级定制

本文发布于:2023-05-14 00:08:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/894830.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:组件   版本   需要   配置
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图