把阿里云原生应用脚手架,搬到IntelliJIDEA中使用!
作者:小傅哥
博客:https://bugstack.cn
沉淀、分享、成长,让自己和他人都能有所收获!
Spring 有一个脚手架 https://start.spring.io/ 阿里云也有一个脚手架 https://start.aliyun.com/ 但这些脚手架都是在网页端的,虽然也能在 IntelliJ IDEA 进行使用,但总是不太方便。为此我决定,基于 IntelliJ IDEA 的插件开发技术,扩展创建工程向导步骤,开发一个我用起来方便的工程脚手架。—— 行动是产生结果的唯一方式! 一、前言
研发,要避免自嗨!
你做这个东西的价值是什么?有竞品调研吗?能赋能业务吗?那不已经有同类的了,你为什么还自己造轮子?
你是不是也会被问到这样的问题,甚至可能还有些头疼。但做的时候挺嗨,研究技术嘛,还落地了,多刺激。不过要说价值,好像一时半会还体现不出来,能不能赋能业务就不更不一定了。
可谁又能保证以后不能呢,技术的点是一个个攻克尝试的才有机会再深度学习后把这些内容连成一片,就像单说水、单说沙子、单说泥巴,好像并没有啥用,但把它们凑到一块再给把火,就烧成了砖,砖就码成了墙,墙就盖成房。 二、需求目的
我们这一章节把 freemarker 能力与 IDEA Plugin 插件能力结合,开发一个 DDD 脚手架 IDEA 插件 ,可能你会想为什么要把脚手架开发到插件里呢?还有不是已经有了成型的脚手架可以用吗?
首先我们目前看到的脚手架基本都是网页版的,也就是一次性创建工程使用,不过在我们实际使用的时候,还希望在工程创建过程中把数据库、ES、Redis等生成对应的 ORM 代码,减少开发工作量。并且在使用的工程骨架的过程中,还希望可以随着开发需要再次补充新的功能进去,这个时候网页版的脚手架都不能很好的支持了。此外一些大厂都会自己的技术体系,完全是使用市面的脚手架基本很难满足自身的需求,所以就需要有一个符合自己场景的脚手架了。
那么,我们本章节就把脚手架的开发放到 IDEA 插件开发中,一方面学习脚手架的建设,另外一方面学习如何改变工程向导,创建出自己需要的DDD结构脚手架。 三、案例开发1. 工程结构guide-idea-plugin-scaffolding ├── .gradle └── src ├── main │ └── java │ └── cn.bugstack.guide.idea.plugin │ ├── domain │ │ ├── model │ │ │ └── ProjectConfigVO.java │ │ └── service │ │ ├── impl │ │ │ └── ProjectGeneratorImpl.java │ │ ├── AbstractProjectGenerator.java │ │ ├── FreemarkerConfiguration.java │ │ └── IProjectGenerator.java │ ├── factory │ │ └── TemplateFactory.java │ ├── infrastructure │ │ ├── DataSetting.java │ │ ├── DataState.java │ │ ├── ICONS.java │ │ └── MsgBundle.java │ ├── module │ │ ├── DDDModuleBuilder.java │ │ └── DDDModuleConfigStep.java │ └── ui │ ├── ProjectConfigUI.java │ └── ProjectConfigUI.form ├── resources │ ├── META-INF │ │ └── plugin.xml │ └── template │ ├── pom.ftl │ └── yml.ftl ├── build.gradle └── gradle.properties
公众号:bugstack虫洞栈 回复:idea 即可下载工程源码
在此 IDEA 插件工程中,主要分为5块区域: domain:领域层,提供创建 DDD 模板工程的服务,其实这部分主要使用的就是 freemarker factory:工厂层,提供工程创建模板,这一层的作用就是我们在 IDEA 中创建新工程的时候,可以添加上我们自己的内容,也就是创建出我们定义好的 DDD 工程结构。 infrastructure:基础层,提供数据存放、图片加载、信息映射这些功能。 module:模块层,提供 DDD 模板工程的创建具体操作和步骤,也就是说我们创建工程的时候是一步步选择的,你可以按需添加自己的步骤页面,允许用户选择和添加自己需要的内容。 比如你需要连库、选择表、添加工程所需要的技术栈等 ui:界面层,提供Swing 开发的 UI 界面,用于用户图形化选择和创建。 2. UI 工程配置窗体
public class ProjectConfigUI { private JPanel mainPanel; private JTextField groupIdField; private JTextField artifactIdField; private JTextField versionField; private JTextField packageField; } 使用 Swing UI Designer 创建一个配置工厂信息的 UI 窗体,通过这样的方式创建可以直接拖拽。 在这个 UI 窗体中我们主要需要; roupId 、artifactId 、version 、package 3. 配置工程步骤创建3.1 数据存放
cn.bugstack.guide.idea.plugin.infrastructure.DataSetting @State(name = "DataSetting",storages = @Storage("plugin.xml")) public class DataSetting implements PersistentStateComponent { private DataState state = new DataState(); public static DataSetting getInstance() { return ServiceManager.getService(DataSetting.class); } @Nullable @Override public DataState getState() { return state; } @Override public void loadState(@NotNull DataState state) { this.state = state; } public ProjectConfigVO getProjectConfig(){ return state.getProjectConfigVO(); } } 在基础层提供数据存放的服务,把创建工程的配置信息存放到服务中,这样比较方便设置和获取。 3.2 扩展步骤
cn.bugstack.guide.idea.plugin.module.DDDModuleConfigStep public class DDDModuleConfigStep extends ModuleWizardStep { private ProjectConfigUI projectConfigUI; public DDDModuleConfigStep(ProjectConfigUI projectConfigUI) { this.projectConfigUI = projectConfigUI; } @Override public JComponent getComponent() { return projectConfigUI.getComponent(); } @Override public boolean validate() throws ConfigurationException { // 获取配置信息,写入到 DataSetting ProjectConfigVO projectConfig = DataSetting.getInstance().getProjectConfig(); projectConfig.set_groupId(projectConfigUI.getGroupIdField().getText()); projectConfig.set_artifactId(projectConfigUI.getArtifactIdField().getText()); projectConfig.set_version(projectConfigUI.getVersionField().getText()); projectConfig.set_package(projectConfigUI.getPackageField().getText()); return super.validate(); } } 继承 ModuleWizardStep 开发一个自己需要的步骤,这个步骤就会出现到我们创建新的工程中。同时在重写的 validate 方法中,把从工程配置 UI 窗体中获取到信息,写入到数据配置文件中。 3.3 配置步骤
cn.bugstack.guide.idea.plugin.module.DDDModuleBuilder public class DDDModuleBuilder extends ModuleBuilder { private IProjectGenerator projectGenerator = new ProjectGeneratorImpl(); @Override public Icon getNodeIcon() { return ICONS.SPRING_BOOT; } /** * 重写 builderId 挂载自定义模板 */ @Nullable @Override public String getBuilderId() { return getClass().getName(); } @Override public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { // 添加工程配置步骤,可以自己定义需要的步骤,如果有多个可以依次添加 DDDModuleConfigStep moduleConfigStep = new DDDModuleConfigStep(new ProjectConfigUI()); return new ModuleWizardStep[]{moduleConfigStep}; } } 在 createWizardSteps 方法中,把我们已经创建好的 DDDModuleConfigStep 添加工程配置步骤,可以自己定义需要的步骤,如果有多个可以依次添加。同时需要注意,只有重写了 getBuilderId() 方法后,你新增加的向导步骤才能生效。 4. 开发脚手架服务
cn.bugstack.guide.idea.plugin.domain.service.AbstractProjectGenerator
public abstract class AbstractProjectGenerator extends FreemarkerConfiguration implements IProjectGenerator { @Override public void doGenerator(Project project, String entryPath, ProjectConfigVO projectConfig) { // 1.创建工程主POM文件 generateProjectPOM(project, entryPath, projectConfig); // 2.创建四层架构 generateProjectDDD(project, entryPath, projectConfig); // 3.创建 Application generateApplication(project, entryPath, projectConfig); // 4. 创建 Yml generateYml(project, entryPath, projectConfig); // 5. 创建 Common generateCommon(project, entryPath, projectConfig); } } 在 domain 领域层添加用于创建脚手架框架的 FreeMarker 服务,它是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。FreeMarker 在线手册:http://freemarker.foofun.cn 按照 DDD 工程结构,分层包括:application、domain、infrastructure、interfaces,那么我们把这些创建过程抽象到模板方法中,具体交给子类来创建。 5. 调用脚手架服务
cn.bugstack.guide.idea.plugin.module.DDDModuleBuilder public class DDDModuleBuilder extends ModuleBuilder { private IProjectGenerator projectGenerator = new ProjectGeneratorImpl(); @Override public Icon getNodeIcon() { return ICONS.SPRING_BOOT; } @Override public void setupRootModel(@NotNull ModifiableRootModel rootModel) throws ConfigurationException { // 设置 JDK if (null != this.myJdk) { rootModel.setSdk(this.myJdk); } else { rootModel.inheritSdk(); } // 生成工程路径 String path = FileUtil.toSystemIndependentName(Objects.requireNonNull(getContentEntryPath())); new File(path).mkdirs(); VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(path); rootModel.addContentEntry(virtualFile); Project project = rootModel.getProject(); // 创建工程结构 Runnable r = () -> new WriteCommandAction(project) { @Override protected void run(@NotNull Result result) throws Throwable { projectGenerator.doGenerator(project, getContentEntryPath(), DataSetting.getInstance().getProjectConfig()); } }.execute(); } } 在 DDDModuleBuilder#setupRootModel 中,添加创建 DDD工程框架 的服务,projectGenerator.doGenerator(project, getContentEntryPath(), DataSetting.getInstance().getProjectConfig()); 另外这里需要用到 IDEA 提供的线程调用方法, new WriteCommandAction 才能正常创建。6. 配置模板工程6.1 模板工厂
cn.bugstack.guide.idea.plugin.factory.TemplateFactory public class TemplateFactory extends ProjectTemplatesFactory { @NotNull @Override public String[] getGroups() { return new String[]{"DDD脚手架"}; } @Override public Icon getGroupIcon(String group) { return ICONS.DDD; } @NotNull @Override public ProjectTemplate[] createTemplates(@Nullable String group, WizardContext context) { return new ProjectTemplate[]{new BuilderBasedTemplate(new DDDModuleBuilder())}; } } 模板工厂的核心在于把我们用于创建 DDD 的步骤 添加 createTemplates 方法中,这样算把整个创建自定义脚手架工程的链路就串联完成了。6.2 文件配置
plugin.xml cn.bugstack.guide.idea.plugin.guide-idea-plugin-scaffolding Scaffolding 小傅哥 com.intellij.modules.platform 接下来还需要把我们创建的工程模板以及数据服务配置到 plugin.xml 中,这样在插件启动的时候就可以把我们自己插件启动起来了。四、测试验证点击 Plugin 启动 IDEA 插件,之后创建工程如下:
快拿去试试吧,启动插件,点击创建工程,傻瓜式点击,就可以创建出一个 DDD 工程结构了。 五、总结学习使用 IDEA Plugin 开发技术,改变创建工程向导,添加自己需要的工程创建模板,这样就可以创建出一个 DDD 脚手架工程骨架了,接下来你还可以结合自己实际的业务场景添加自己需要的一些技术栈到脚手架中。 如果你愿意尝试可以在工程创建中链接到数据库,把数据库中对应的表生成Java代码,这样一些简单的配置、查询、映射,就不用自己动手写了。 在开发 DDD 脚手架的源码中还有一些细节过程,包括图标的展示、文案的信息、Freemarker的使用细节,这些你都可以在源码中学习并调试验证。
重要信息!日本经济泡沫给中国房地产的启示日本90年代的经济泡沫可以说是震惊全世界,日本的经济泡沫主要是来自于房地产行业,房地产泡沫的戳破让日本从此失去世界经济发展的竞争力,让日本几十年都回过劲来,日本当年的经济泡沫经历正
电脑最新全球PC市场TOP5惠普戴尔大幅下跌你用哪家?市调机构Canalys近日发布了2022年第三季度(79月)全球个人电脑市场报告,来带大家看看目前全球个人电脑市场(台式机笔记本电脑)各大厂商的表现首先是整体情况,2022年第三季
我国领先全球的四大ampampquot黑科技ampampquot究竟是什么?西方国家交钱也买不到中国领先世界的技术越来越多。目前,许多技术已经能够领先美国。可以看出,如果你想领先,你可以领先美国是对中国科技的认可。然而,在经历了技术落后的时代,我们知道没有技术,也就是说,如果
23天露营进藏在草场露营,居然看到了最美的银河系007。昌都努力和风交好的一天过了金沙江,到了西藏的芒康,每天最重要的事情就是找露营地寻找的就是未知,所以也才会遇上一些很未知的地方,很未知的朋友,比如牦牛,比如鹿(具体品种我也不
数读骑行徒步露营火了轻户外如何占领年轻人的假期?当天去当天回的一日游旅行产品在国庆假期热度高涨,露营经济继续红火,短程多次出行的即兴度假模式成为年轻人旅游新风尚,这届年轻人说走就走的度假距离越来越近,也越来越绿色和环保。短途高铁
清远石角墟渡船到对岸的迴歧原想再到石角镇渡口买几条鱼,改善一下口味,哪知,到了渡口,却没有购买欲,也许,来的次数多了,了解的也多,对野生鱼的看法便有了些新的认知,更何况摊档上天天就是那几个人占着摊位,有规律
湛江带动现代化沿海经济带西翼强劲舞动航拍中科炼化一体化项目园区。记者郎树臣摄党的十八大以来,湛江坚定扛起习近平总书记赋予湛江打造现代化沿海经济带重要发展极和与海南相向而行的重大使命,紧紧把握全省构建一核一带一区区域发
人脑是一台计算机吗?1。发展历史为了回答人脑是一台计算机吗这个问题,先来了解一下计算机的发展历史,根据计算机的发展总结计算机的特点。1931年,VannevarBush在麻省理工学院(MIT)发明并制
广汽杀出一匹新能源快充独角兽前段时间,广汽董事长曾庆洪笑称在给电池厂商打工,可见电池厂商在新能源车产业链中有多大的话语权,也难怪这会儿大佬们都纷纷将目光瞄向了这个赚钱的赛道。近日,动力电池公司广州巨湾技研有限
Model3终结者来了!揭秘深蓝SL03配置大全他来了,他来了,他带着王炸啊不是,他带着配置单走来了。在大家的翘首企盼中,长安深蓝SL03终于要揭开自己神秘的面纱,虽然17。9823。18万元的预售价已经让我做好了吃瓜的准备,但
强烈推荐!15个你闻所未闻的黑科技网站不看后悔系列!强烈推荐15个你闻所未闻的黑科技高端和有趣的网站!一定要在收藏夹里给它们腾出位置来哦1VR环游世界网址httpswww。airpano。com想环游世界看遍世界的美景