在线生成原型工程

前期调研

最开始实现的原型工程是通过maven archetype生成的,可以通过配置私有库idea工具生成和脚本命令的形式生成,但是生成的过程需要检查环境等等,而且时间也需要的长一点,大概一两分钟。由此,想要优化生成工程的方式,因此提出了想要通过页面端直接简单配置从而生成项目工程的脚手架(包括前后端工程)。

google了下现有的类似的工具,发现了start.spring.io和start.aliyun.com,但是其实两者都是基于使用Spring Initializr来实现这部分功能。

看一下这两个工具的页面:

这两个工具功能都很强大,提供组件版本、开发语言,构建方式的选择等等。但是目前考虑的还是简单的原型工程生成,这个功能只是把我们自己的模板工程提供页面简单配置下载而已,因为可以参考,ailiyun的提供示例代码功能,跟我们的需求很像,比较符合我们的需求,就想着仔细研究一下,加了他们自己的使用群,但是迫于这部分代码不考虑开源,于是又开始自己的开发之路。好在他们提供了这篇实现说明:

https://developer.aliyun.com/article/752200

十分感谢陈曦大大的详细讲解。

通过这篇文章,也大概了解了Spring Initializr的使用思路。在公司架构大佬的协助下,完成了这个功能的实现,具体实现如下:

下载源码

直接下载Spring Initializr的源码,准备在其原工程的基础上修改,节省时间。

具体Spring Initializr的实现原理也可以参考阿里云实验室文档中有关原理篇的讲解,文章中有些图片挂了,可以参考转载文章。

首先了解下项目的各个模块的作用:

  • 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入口;

默认情况下,initializr已经支持4种项目类型:

  • /pom.xml 生成一个Maven的pom.xml配置文件
  • /build.gradle 生成Gradle的配置文件
  • /starter.zip 生成zip方式压缩的工程文件
  • /starter.tgz 生成以tgz方式压缩的工程文件

因为是下载的前后端的原型工程包,因此/starter.zip 就已经满足于我们的要求,不需要自己再重新编写。

编码流程

主要操作的包包括

  • initializr-metadata 元数据配置

  • initializr-service-sample 示例启动模块、配置模块

  • initializr-web 入口工程(controller)

  • initializr-generator: 工程生成库

  • initializr-generator-spring: 用于生成典型的spring boot工程()

首先在initializr-service-sample 中配置文件中添加需要生成项目的types:

types:- name: WEB Projectid: web-projectdescription: Generate a WEB based project archivetags:build: webformat: builddefault: falseaction: /starter.zip- name: back Projectid: back-projectdescription: Generate a back-project based project archivetags:build: backformat: builddefault: trueaction: /starter.zip

根据配置,在initializr-generator中添加对应的build代码

public class BackBuild extends Build {
...
}
public final class BACKBuildSystem implements BuildSystem {/*** Maven {@link BuildSystem} identifier.*/public static final String ID = "back";@Overridepublic String id() {return ID;}@Overridepublic String toString() {return id();}}
class BACKBuildSystemFactory implements BuildSystemFactory {@Overridepublic BACKBuildSystem createBuildSystem(String id) {if (BACKBuildSystem.ID.equals(id)) {return new BACKBuildSystem();}return null;}
}

然后在initializr-generator-spring中以Contributor的形式扩展自己需要生成项目的配置,此代码暂不共享,提供思路,主要是在这里实现初始化项目中的变量和对静态资源、模板资源的生成功能,主要就是在resources中放置自己原型工程的模板代码,为了更好的维护性,将代码分为静态(不需要替换变量,不需要修改后缀为.mustache)、模板资源(需要将文件后缀改为.mustache:因为项目中是通过此mustache模板引擎渲染生成代码的,mustache中替换变量格式是{{变量名}})。

新增元数据

rootArtifactId

流程:

web模块

ProjectGenerationController(invokeProjectStructureGeneration)

1.–>ProjectRequest(新增变量)

private  String rootArtifactId;getter、setter
......

2.–>request.convert(DefaultProjectRequestToDescriptionConverter) 新增转换

description.setRootArtifactId(request.getRootArtifactId());

3.–>BACKProjectContributor.initializeProjectModel() (获取ProjectDescription,并转换为Map)

private Map<String, Object> initializeProjectModel() {Map<String, Object> model = new LinkedHashMap<>();model.put("artifactId", description.getArtifactId());model.put("groupId", description.getGroupId());model.put("version", description.getVersion());model.put("packageName", description.getPackageName());model.put("rootArtifactId", description.getRootArtifactId());model.put("description", description.getDescription());return model;
}

4.–>MutableProjectDescription、ProjectDescription中定义新增变量

/*** 自定义参数变量* @return*/
String getRootArtifactId();

5.–>BACKProjectContributor中原型工程生成分为两个模块,一个是不需要替换变脸的静态资源,一个是需要替换的模板资源

generator-spring(生成springboot代码包)1.staticResource(静态资源):
位置在resources/module/2.templateResource(模板资源):
位置在resources/templates/module/

6.–>template 替换变量,生成项目。

启动项目

通过initializr-service-sample中ServiceApplication中启动

注:项目部署要发布过程中打包报错:

1.checkstyle-validation 中校验比较多,可去除

2.默认打包方式不是以springboot方式打成一个包,因此需要自行修改

<artifactId>initializr-service-sample</artifactId>
<name>Spring Initializr :: Service (Sample)</name>
<packaging>jar</packaging>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>spring-boot</classifier><mainClass>sample.service.ServiceApplication</mainClass></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins>
</build>

至此完毕,又通过自己写的简单页面,实现了此功能。

springboot在线原型工程生成工具相关推荐

  1. 基于bboss开发平台eclipse开发工程生成工具介绍

    为什么80%的码农都做不了架构师?>>>    基于bboss开发平台eclipse开发工程生成工具介绍 一.工具简介   bboss开发平台发布出两个资源包:  war部署包  数 ...

  2. springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  3. android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  4. 编码 data:text/html;c,[网页设计]图片base64编码利器:在线 Data URI 生成工具 – Duri.me...

    这篇文章介绍一款在线的图片 base64 编码利器 - Duri.me.data URI 图片是 base64编码的图片文件,可以嵌入到 HTML 或者 CSS 文件中,能够减少 HTTP 请求,提高 ...

  5. AI在线文章智能生成工具

    文章智能生成工具通过在线文章采集,只需要我们输入我们的关键词,就可以实现热门平台的文章素材收集,支持精准标题采集提高内容的相关性,也可以通过关键词衍生采集,提高我们素材的收集数量,并通过自动的伪原创. ...

  6. 《收藏》新浪短网址API接口(T.CN短链接)在线批量缩短生成工具推荐

    新浪于前段时间关闭了对外的网址缩短接口,平时用惯了短链接的朋友几十分不习惯,作者收集了几个最新的短链接在线生成工具,亲测可用! 1.冷狗短链接 平台官网:http://dogdwz.cn/ 2.青桃短 ...

  7. 在线html批量生成工具,在线网址链接批量生成器

    批量下载功能可以方便的创建多个包含共同特征的下载任务.例如网站A提供了10个这样的下载链接: http://www.a.com/01.zip http://www.a.com/02.zip ...(中 ...

  8. 亲测可用:两个在线的测试数据生成工具

    文章目录 generatedata4.com onlinedatagenerator.com 大家好!我是只谈技术不剪发的 Tony 老师. 我们在进行软件开发和数据库性能测试时,经常需要使用到大量的 ...

  9. 三款在线css3样式生成工具

    http://jquery.org.cn/css/css3preview/Box-Shadow.html http://css-tricks.com/examples/ButtonMaker/ htt ...

最新文章

  1. window.open的用法---javascript学习笔记
  2. 运行python-thrift的DEMO
  3. mysql 定时同步数据_如何定时备份Mysql数据库数据?
  4. 时间戳类型的字符串 {Timestamp@15601} “2021-07-14 18:56:53.0“ 变成带T的Object类型 2021-07-14T10:56:53.000+0000 处理
  5. 当我们在谈论技术时,技术的本质和价值究竟是什么?
  6. 前端学习(1672):前端系列实战课程之加速减速运动
  7. VS2017 安装 QT5.9
  8. 【Python爬虫】网络爬虫的“盗亦有道”
  9. thinkphp结合U方法,点击验证码刷新
  10. linux怎么安装scp服务,linux下ssh安装与scp命令使用详解
  11. Java设计模式学习总结(12)——结构型模式之外观模式
  12. Hibernate之Inverse的用法
  13. 建筑系学生怎么系统地学 Photoshop、CAD 之类软件?
  14. 安装svn和安装svn汉化语言包
  15. 撰写MLA格式的毕业论文,需留意下边几个文件格式标准
  16. 【电子设计大赛】2017 年全国大学生电子设计竞赛 仪器和主要元器件清单
  17. 小波去噪阈值改进matlab,小波阈值去噪的改进_改进的小波阈值函数 - 全文
  18. 主磁盘分区和逻辑磁盘分区的区别是什么?
  19. 1. 微信开发-自动回复
  20. JVM源码分析之Metaspace解密

热门文章

  1. abaqus 6.14有限元分析高级培训视频教程-接触 热力 疲劳分析
  2. Sophus线性代数库学习大全
  3. 2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究
  4. java request 获取文件流_HttpRequest获取文件流,HttpResponse输出文件流
  5. c语言程序设计王立柱pdf,C语言程序设计 教学课件 朱立华 王立柱 C语言程序设计课件第5章090909.pdf...
  6. 视频怎么加水印上去?
  7. 泛海微低功耗的电压检测器XC61C系列
  8. vs为什么打了断点不断_斯诺克德国大师赛直播地址:丁俊晖VS卡蒂!塞尔比罗伯逊出局...
  9. 管理经济学【八】之 完全竞争市场中的企业决策
  10. 智慧养老解决方案-居家养老管理系统-养老院解决方案-新导智能