在线生成原型工程

前期调研

最开始实现的原型工程是通过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. 如何在windows 10 x64安装佳能 CP900 驱动
  2. mysql学习总结一:mysql的安装,介绍,基本命令操作
  3. 关于java中死锁的总结
  4. 用户sa 登陆失败 SQLServer 错误18456 图解
  5. QT的QMediaPlayer类的使用
  6. mock 抛出一个异常如何终止_教你使用Mock完成单元测试
  7. Sharepoint Ribbon Loaction
  8. 又一个手机圈大佬确认离职!网友:圈内再无万瓷王
  9. 翁恺老师C语言学习笔记(十一)字符串
  10. 1081. Rational Sum (20)-PAT甲级真题
  11. centos yum mysql-devel 5.5_CentOS 6.5通过yum安装 MySQL-5.5
  12. EMC理论基础知识——电磁屏蔽
  13. IM即时通讯实现的原理
  14. mac gif图片压缩
  15. bzoj 4199: [Noi2015]品酒大会 (后缀自动机+DP)
  16. 12.15 村长项目借口
  17. 联通光猫TEWA-800E设置桥接模式
  18. 【海】沙滩啤酒win7桌面主题
  19. r语言liftchart_最棒的7种R语言数据可视化
  20. mysql数据库之ddl语句盘点

热门文章

  1. 【读书笔记】游戏开发原理
  2. PS 模糊|锐化|涂抹工具
  3. linux-bash脚本
  4. python实现简单的神经网络,python调用神经网络模型
  5. P2415Q / P2715Q显示器:HDMI 4K 60HZ, 设置带有HDMI 2.0端口,支持4K x 2K 60Hz
  6. FFmpeg入门 - rtmp推流
  7. SpringBoot运行显示Application run failed
  8. YDOOK:CSDN 1024 程序员节日专文:Ubuntu remotely install cuda
  9. 解压系统镜像文件img并查看内容
  10. Qcom wifi sar架构