菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

如何实现一个有趣的Java脚手架

原创
05/13 14:22
阅读数 227

课程推荐:Java开发工程师--学习猿地--送7个上线商业项目

新建应用面临的问题
在实际项目来发中,当我们创建一个新应用时,大概会遇到哪些问题?

创建应用过程比较繁琐,很多内容其实都是类似的,但就是得重新写一遍。有人可能会说用 Spring Initializr ,对于自己测试来说还好,但对于实际项目来说,还是不太方便。首先,每个公司里面应该都会有对应的应用分层规范,这时候一个项目是涉及到多个模块的,从这一点上来说, Spring Initializr 就不支持;然后一些公司自己的二方包,也没办法快速引用
模块问题:对于一些复杂的业务系统,真的是有非常多的模块,如果没有系统的学习过相关内容,或者没有经历过这么复杂的业务开发,可能我们很难理解为什么会有这么多的模块?但不可否认的是,很多项目就是这么复杂
依赖问题:一种是各类开源的依赖;还一种是公司自己开发的一些公用组件,或基于一些开源组件二次开发的组件。引用开源组件时一般都是看对应的官方文档,公司自己开发的一般也有对应的接入文档。但如果涉及到的依赖太多,接入成本其实很大的。一个是依赖之间的版本管理问题;一个是各个组件的初始化配置问题。对于老同学来说,还比较好解决,该踩的坑都踩过了,但对新人来说,是一件非常痛苦的事情:可能中途会遇到各种问题,会浪费很多时间,环境问题本来就是很复杂的问题
配置问题:每个公司对配置的管理肯定是不一样的,这一块其实也是很头痛的;文档详细还好,文档如果不详细,很磨人的。这里少了个配置也要引入这个namespace,那里少了个配置要引入那个namespace,新人哪里知道那么多?或者说没接触过哪里知道这些?这时候很依赖文档,然后就想问问你,你对自己维护的文档很满意吗?一个应用中可能依赖了很多技术栈,每个技术栈对应的文档都散落在不同的地方,难搞
对于市面上的一些开源脚手架项目,一般就是集成了一大堆功能,其实用处不大。和公司自己的技术栈对不上,有什么用?有些应用也根本用不上那么多功能,还得自己再把这些内容给删除,搞来搞去,最后出问题的可能性可能更大

如何解决这些问题

创建应用过程比较繁琐,每次都要写大量类似的东西:我们可以提供对应的模板,然后有一个对应的脚手架基于这些模板快速创建一个应用
模块问题:脚手架肯定要支持多模块,可以基于 Spring Initializr 该创造,也可以自己实现,但肯定要能支持多模块
依赖问题:一般就是公司自己维护一个父pom,然后所有的应用都使用这个父pom,这样可以有效的解决依赖冲突问题
配置问题:基于脚手架生成的应用,同时为引入的组件生成相关的初始化代码,可以在代码注释中带上相关的文档链接

还有哪些可以优化

使用方式必须要简单: 参考 Spring Initializr 和 阿里 Starter 的使用方式,直接在界面上勾勾选选
灵活性:动态新增修改一些组件相关的信息,比如版本升级,应该是可配置的。这部分相关的内容可以由管理员来维护
友好提示:在组件展示的时候,该组件对应的负责人和文档链接应该展示出来,以便使用者可以便捷的了解这个组件
示例代码:基于脚手架创建应用时候,同时可以根据用户选择的组件生成对应的示例代码。但这部分应该是可选的,新人可能有示例代码会友好一些,但老同学可能觉得没必要
动态模板:不同业务团队,可能需要生成的模板代码是不一样的。怎么说?公司内对于应用的层次结构基本是一致的,但是不用的业务团队,需要生成的对应的模板可能是不一样的,而如果不用模板生成就会带来很多重复性工作。这一块也需要支持
一体化:公司内新建一个应用,应该需要去对应的系统上注册,可以和这个注册系统打通,应用注册成功直接跳转对应的脚手架创建应用界面,创建成功后直接将这部分文件初始化的gitlab

如何实现

开始参考了 Spring Initializr 的实现,觉得有点复杂,也不够灵活,所以还是基于freemarker实现了一个。基于freemarker实现有一个好处:灵活,可玩性比价大,比如说:我希望在创建应用的时候,将对应的创建人添加到代码注释上。这应该是一个比较常见的需求吧?脚手架接入SOS就可以获取到当前应用创建人信息,在用户创建应用的时候,我们可以将对应的用户信息存到上下文并透传给freemarker。同理,基于这个特性,我么可以定义一些其它的变量,可玩性比较高
应用 -> 模块 -> 依赖 : 三层结构。依赖就是我们应用中具体的依赖;模块是通用的:比如 WEB层、SERVER层、CORE层 等等;一个应用对应一个或多个模块,代表这个应用的结构。基于这个我们可以定义一些通用的应用,比如:简单应用、复杂应用、测试专用 等等。这样用户在创建应用时,就可以根据业务的复杂度快速的选择一个模块来创建应用了。应用、模块、依赖 都是可配置的,基于这个我们可以快速的创建一个新的应应用模板
模板文件:可配置。通过控制台可以上传对应的模板文件,除此之外每个模板文件应该有对应的作用域:所有范围生效、或者针对某个应用类型、或这对某个模块、或针对某个依赖
依赖问题:依赖之间的引用问题,一些依赖可能除了本身,还需要引入一些其它的依赖;一个模块也可以看成是另一个模块的依赖,这些问题都要处理好

作者:spilledyear
链接:https://juejin.im/post/6892712256459505678
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批