Photo @ Alibaba Initializr 官网
文 | 良名
背景
相信很多人都使用过 start.spring.io 来初始化自己的 Spring Boot 工程,这个工具为开发者提供了丰富的可选组件,并且可以选择多种打包方式,大大方便了开发人员的使用。最近,阿里的 Nacos、Sentinel 也进入 start.spring.io 的选项中,进一步的方便开发者使用阿里云的产品。
但是,生成的工程骨架中,只有组件坐标信息,缺少对应的使用方法和 Demo 代码;于是,开发者还是需要去寻找相关使用教程,或者样例代码;如果找的不对,或者是版本不匹匹配,还需要花费不少时间去排查和解决问题;这些问题都在无形中增加用户的工作量。
我们将对软件工程的抽象层次自上而下进行切分,会得到如下的几个层级:行业、解决方案、应用、功能、组件;明显的, start.spring.io 目前只能提供组件级别的支持。再将组件这层展开,会发现这样一个生命周期:组件引入、组件配置、功能开发、线上运维。 start.spring.io 也只实现了“组件引入”这一功能。
我们的目标是“让阿里云成为广大 Java 开发者最好用的云”。要实现这个目标,是否可以再向前走几步,在解决“组件引入”问题的基础上,将组件的典型使用方法、样例代码、使用说明也加入到工程中呢?基于这种思考,我们上线了自己的 bootstrap 站点 start.aliyun.com :
https://start.aliyun.com/
当然,本着不重复造轮子的原则,我们不再构建一套工程生成底层框架,而是使用 Spring Initializr 来实现这部分功能。在此之上专注于增加新特性,实现服务广大开发者的目标。
Spring Initializr:
https://github.com/spring-io/initializr
在 start.aliyun.com 中,我们为广大开发者带来了如下便利特性:
1、为每个组件提供了单独的 DemoCode 和对应的配置样例(本次已发布)。
2、工程内置说明,减少用户查找文档的困难(部分实现)。
3、开发者只需要做减法,而非加法的使用方式(部分实现)。
4、提供多组件集成的解决方案(开发中)。
5、定期跟进start.spring.io的更新,方便大家使用到spring的最新功能。
start.aliyun.com:
https://start.aliyun.com/
未来,我们还需要再助力开发者这条路上继续发力,不仅仅是做好组件集成的工作,还要需要继续向上支持,提供更多功能、服务、应用层级的快速构建能力。
本文,围绕 spring initializr 框架,以 start.spring.io 为例,全面的给大家介绍如何使用和扩展这个框架,以及背后的运行原理。
使用篇
由于 spring-initializr 提供了灵活的扩展能力,以及丰富的默认实现;其使用方式也是非常的灵活多变;为了便于说明,我们直接通过 start.spring.io ,看看 Spring 自己是怎么使用这套框架的。
基本用法
基本用法的原则,是尽量少写代码,甚至是不写代码。只通过配置就可以实现 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-service-sample: 基本使用案例。
initializr-version-resolver:版本号解析能力。
initializr-web: 提供给三方客户端使用的web入口。
基本配置
1、完成了框架引入,就需要做一些基础配置了。
2、支持哪些语言:Java、groovy、Kotlin。
3、支持哪些版本:1.8、11、13 。
4、支持哪些打包方式:jar、war 。
将这些信息全部配置到 application.yml 文件中,如下:
initializr:
packagings:
- name: Jar
id: jar
default: true
- name: War
id: war
default: false
javaVersions:
- id: 13
default: false
- id: 11
default: false
- id: 1.8
name: 8
default: true
languages:
- name: Java
id: java
default: true
- name: Kotlin
id: kotlin
default: false
- name: Groovy
id: groovy
default: false
其中 name 是可选的, id 是必填的。
每个配置项下,可以有一个默认值(将 default 这是为 true 即可),除了这些基本配置,我们还需要定义可以支持的项目类型:
initializr:
types:
- name: Maven Project
id: maven-project
description: Generate a Maven based project archive.
tags:
build: maven
format: project
default: true
action: /starter.zip
- name: Maven POM
id: maven-build
description: Generate a Maven pom.xml.
tags:
build: maven
format: build
default: false
action: /pom.xml
- name: Gradle Project
id: gradle-project
descrip