范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

把阿里云原生应用脚手架,搬到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的使用细节,这些你都可以在源码中学习并调试验证。

被年龄比自己大的叫姐?做完双眼皮后瞬间年轻好几岁单看眼睛,你们看她像多大年纪的?汪女士今年25岁,但眼睛看着像30多岁的人。在公司里,比她大的同事都喊她汪姐,也是很无奈了。汪女士就一直觉得是自己长得太显老了,她说有一天新来的小姑什么样的下巴才好看?大家常关注脸的胖瘦长短,希望自己是巴掌脸,其实好看的下巴会给脸型加分很多。什么样的下巴才算好看呢?基本上都符合以下几个特点下巴的长度也就是我们常说的三庭五眼比例。从发际线到眉心,再百达翡丽手表发展史,最贵的腕表头号周刊从第一块腕表问世,腕表已有200多年的发展历史,那么从腕表问世到现在,最贵的腕表品牌及最贵的手表分别是谁呢?其实答案无需质疑,很多人想必也都猜到了,那必须是百达翡丽了,在第桃花坞2我只想看超模陈瑜的穿搭五十公里桃花坞第2季一回归,就霸占了几天的微博热搜。不过大多的热搜话题都是围绕着长辈与晚辈之间的代际问题展开,有人甚至拿来与无法超越的花儿与少年第二季相比。不过以另一种角度来看,真季后赛效率值排行榜,库里仅排在第5,前4人是哪些大神?2021到22赛季NBA总决赛正式落下帷幕,最终笑到最后的是勇士队,而库里凭借者在总决赛的优异发挥获得了个人职业生涯第一个FMVP。再拿下这一个总冠军以及FMVP之后,库里是否能够李敬宇正式退役最大遗憾是没能为山东男篮夺冠,希望早日培养出冠军球员6月20日,山东高速男篮官方宣布球队副队长李敬宇正式退役,成为球队教练组助理教练。31岁的小李飞刀从此成为山东男篮助理教练。对此,不少球迷感到有点突然。山东男篮队长陶汉林也在微博上勇士媒体人回复杜兰特你为了篮网而离开勇士你就是在酸直播吧6月21日讯今日,NBA名宿巴克利在做客播客节目时表示杜兰特来勇士之前勇士就已经是冠军了,他得以司机的身份去赢下属于自己的总冠军,科比是这样,詹姆斯也是这样,我们需要以高标准泰晤士国际足联可能效仿泳联,禁止跨性别运动员参加女子赛事直播吧6月21日讯来自英格兰媒体泰晤士报的消息称,国际足联可能会遵循国际泳联禁令,禁止跨性别运动员参加女子足球赛事。国际足联目前正在考虑遵循国际泳联的新政策,该政策规定,任何经历过TMZ隆多与前妻达成协议紧急保护令已经被撤销直播吧6月21日讯根据TMZ证实,骑士后卫拉简隆多与前妻阿什利巴奇勒已经达成协议,紧急保护令已被撤销。根据报道,上个月,隆多在家中与11岁的儿子玩游戏,前妻巴奇勒要求他们先不要玩游勇士20212022NBA总冠军游行恭喜勇士,八年六进总决赛,终于又在今年收货了第四个冠军!15年的他们,库里,汤普森和格林在科尔的传切体系下绽放光彩,拿下了属于他们的第一个冠军。不过那一年的总决赛FMVP却并不属于医生建议患有甲状腺结节,坚持3个方法,结节小得快对于甲状腺结节大家都是不陌生的,在这个经济快速发展的时代,每10个人中就有8个人患有甲状腺疾病,比如甲状腺结节,甲状腺肿大,甲状腺囊肿等,虽然说这类的疾病都是良性的,但也不能忽视恶
陈戌源被抓后才知道他是有多么虚伪简直是令人发指近期,中国足协主席陈戌源终于被查,陈戌源的被抓,让广大球迷直呼其罪有应得。在陈戌源被抓时,当时他正在国足主帅选帅的会议上,会议中直接被黑衣人带走,可以说完全没有给他处理后事的机会。花甲少年未白头(114)终结篇2022年,疫情依旧肆虐,各地防控任务依旧严峻。经过中国围棋协会等多方面的协调努力,华锐教育杯全国围棋锦标赛终于在11月14日至24日于江苏无锡中威蓝海御华酒店举行。缺席上一届围乙虚领顶劲心解撷英虚领顶劲是太极拳界共同尊崇的功法。1武氏太极拳名家郝为真(18491920)注虚领,非实领也以意达到,并非着实用力也。顶劲者,神贯于顶也。用力则顶必硬,血气不能流通。以意达到于顶,曝前国家男篮主帅下课!因带队成绩不佳辞职,将赴篮协担任要职虽然如今的中国男篮已经失去了亚洲霸主的地位,无缘去年的东京奥运会。但当年拥有姚明王治郅易建联的中国队也曾在1996年的亚特兰大奥运会上夺得过前8名的好成绩,而率领这支中国队的是CB从经济学角度看男足为什么不行中国男足近二十年来成绩是一年不如一年,二十年前在世界杯上的惊鸿一现,本以为是男足实力腾飞的起点,没想到却成了男足史上最辉煌的绝唱。后来男足搭着房地产行业起飞的便车,进入金元足球时代勇橄无畏,激战北碚重庆市7人制英式橄榄球锦标赛热力开赛2月14日,中国体育彩票杯2022年重庆市7人制英式橄榄球锦标赛在北碚区缙云体育中心激情开赛。这是继2020年重庆市7人制英式橄榄球锦标赛在北碚成功举办后,该赛事再度落地北碚。本次科幻感拉满!智能手表可内置投影仪三星已申请专利宅秘新闻当前,根据相关调研机构的数据,智能手环市场正在萎缩,更多的消费者转而投向了智能手表的阵营。而在智能手表领域,三星凭借着广大的用户基础和技术积累,成为处于行业领先地位的厂商。45亿条国内数据疑似泄露目前,有网传消息称,疑似约45亿条国内个人信息在暗网被泄露,包括真实姓名电话与住址等,引发各界关注。专家表示,近年来侵犯公民个人信息危害信息数据安全的行为呈现高发多发态势,API接共封装光学CPO人工智能高算力赛道,核心环节龙头梳理随着人工智能大数据云计算应用需求的发展,驱动数据中心规模不断扩大,对带宽容量与高速数据传输速率的需求明显增加。不同服务器之间需要频繁的大量数据交换,数据互联的带宽往往会限制整体任务在唯品会打折买到了华为手机,使用一周说说感受情人节本来逛唯品会是想给对象买礼物的,结果头脑一热给自己下单了一台手机。现在体验了几天特来说说体验。手机品牌是一直在用的华为,对这个品牌的认可度夸张点说是已经深入到了骨髓。这次基本Snap把让AR更逼真的新技术用在Tiffany上,AR试穿会让你更有消费欲吗?2月15日,科技公司Snap宣布旗下AR创作平台LensStudio面向全球开发者正式上线光线追踪技术。据了解,这项技术可以让数字物体呈现更真实的光照反射,增强AR体验的真实感。依