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

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

鹤壁市淇滨区桑园村入选全国乡村旅游重点村近日,文化和旅游部国家发展改革委联合开展全国乡村旅游重点村镇遴选推荐工作,确定了第四批200个全国乡村旅游重点村和第二批98个全国乡村旅游重点镇(乡)名单。河南7村3镇(乡)入选全邂逅巴音布鲁克大草原莫笑少年江湖梦,谁不少年梦江湖!每个人心里,都有一个武侠梦。和话本里一样的鲜衣怒马,仗剑天涯。但往往因为工作和生活而没有机会!我也是其中之一。去年七月,因为工作变动我来到了新疆。不重庆武隆武隆仙女山二日游攻略,仙女山大草原最佳路线安排话说重庆是山城,但是!有一片美到不像话的大草原,在仙女山景区,山上有成群的羊和马,还有木质房屋,有第二个瑞士之称哦,很适合夏天避暑和拍照。超长假期这么浪毕业趣哪玩美好旅行地武隆仙女全球最大的皇家园林,90年建成,却取了一个很小气的名字这是一座皇家园林,始建于清朝1703年,经历康雍乾三个王朝两代帝王的营建,历时89年,康熙皇帝却给它取了一个很小气的名字。它占地面积564万平方米,折合8400亩,相当于8个北海公确定的国内与不确定的出境,旅游人这样计划2023年三年防疫贯穿大众生活方方面面,当疫情即将结束时,开心与激动心情之外,如何让生活工作重回疫情前的状态成为新挑战。有人形容这种状态是,之前买菜囤粮等被封,现在买抗原囤药等发烧。大众对于旅游复苏?沙特买光伏?电车销量继续飙升?最近的经济和未来最近有一种观点比较流行,认为旅游业会迎来复苏。杭州实际上,从事实出发,旅游业很难迎来复苏,因为决定旅游业复苏的基础是1消费者的人均收入短时间上涨,消费意愿和能力提高2旅游基础设施投成都包机出海力图收获黄金云衡微语撸起袖子加油干之前,为了夺回失去的三年,浙江再现神操作,此刻,很多城市还在为疫情犹豫不决,而浙江却出乎意料地开始了欧洲之旅,赶上最早一航班,为搭建经济合作撬开法德的大门!据局长与大V茶座丨藏不住了!青岛人熟悉的中山公园大变样提起中山公园,青岛人首先想到的都是标志性的喷泉,夏天的樱和秋天的菊。而如今的中山公园,却多了很多略显陌生却充满诗情画意的角落。8日,市委网信办举办的局长与大V茶座活动中,市园林和林郑州大部分市管公园已恢复开放12月8日,记者从市园林局系统获悉,大多数市管公园已经恢复开放,另有部分正在筹备于近期恢复开放。目前,已经恢复开放的有郑州市人民公园郑州市紫荆山公园郑州植物园郑州市动物园郑州市月季侠盗猎车手罪恶都市forMac中文版(附游戏秘籍)侠盗猎车手罪恶都市forMac是一款深受玩家喜爱的动作冒险游戏,侠盗飞车罪恶都市mac版以犯罪为主题,讲述了黑手党杀手出狱后发生的一系列事件,这里准备了侠盗猎车手罪恶都市游秘籍,教2022年电动汽车销量增长近70,第一名半年内卖出60多万辆不得不说,随着天然气价格持续高居不下,以及环境问题日益严重,近些年新能源电动汽车可谓飞速发展,销量一直呈直线上升趋势,特别是北美西欧以及中国的电动汽车市场增速更是尤为显著。根据调研
10年后,3类房子将沦为贫民窟?懂行的顾问人已经在悄悄脱手自从2020年以后,我国房价只涨不跌的神话被打破,很多城市的房价开始出现回落。尤其是去年下半年,不断有房企爆发债务危机,各大城市的房价不断下跌,甚至出现一些房企低价倾销的情况。面对英超疯狂夜枪手豪取5连胜哈兰德创纪录热刺战平红军读秒绝杀北京时间9月1日凌晨,英超第5轮激战5场,其中阿森纳曼城利物浦坐镇主场分别迎战维拉诺丁汉森林和纽卡斯尔,热刺客场挑战西汉姆联,伯恩茅斯对阵狼队,从对阵形势和赛果看,可谓是焦点云集,电讯报英超若按伯利设想打南北全明星,红军曼城恐垄断北方首发直播吧9月14日讯据每日电讯报报道,切尔西新老板主席伯利建议英超举行一场南北全明星对抗赛,并呼吁英格兰的赛事应该从美国体育中吸取一点经验。伯利的想法,可能会引起欧洲各国那些已经在为危机升级!人民币继续持续贬值?货币战打响?带来什么影响?毫无征兆,一夜之间,近期人民币汇率就贬值了,本来都已经创下历史了,但是最近人民币的贬值又有了很大幅度,已经跌破了6。86的关口,那人民币会不会贬值到7呢?汇率战是不是又要打响了?为离岸人民币对美元汇率破7,外汇存款准备金率已下调南都讯记者赵唯佳北京时间9月15日晚间,离岸人民币对美元报价跌破7。0关口,刷新2020年7月以来低位。截至发稿,离岸人民币对美元汇率最低触及7。0183,在岸人民币对美元汇率则留德部长叫嚣减少对华依赖,就算失去在华业务,也不会放弃批评中国据环球时报援引路透社发布的报道,德国经济部长哈贝克近日在接受媒体采访时公开宣称,德国政府目前正在着手起草一份全新的对华贸易政策。在新政策下,德国对于中国供应链依赖性会降低,尤其是针咱们不能这么对待蔡崇信先生,他一直在为中国篮球做着贡献蔡崇信先生今天布鲁克林篮网队官宣签下日本前锋渡边雄太,这则消息刺激了不少国内球迷。他们认为蔡崇信先生作为一名华裔老板,不应该签日本球员,而是应该签一名中国球员,比如曾凡博张镇麟郭昊再见山东!巩晓彬爱徒接近离队,昔日老臣仅剩陶汉林一人北京时间9月14日,根据江南的城透露,前山东男篮球员王汝恒,正在与山西男篮接触,如果一切顺利,他有望在窗口期加盟山西男篮。虽然说王汝恒并没有跟随球队合练,也没有参与夏天一些列的热身下午14点!记者最新报道引爆争议,中超联赛成笑话,球迷骂声一片北京时间8月31日下午14点,中国足球传来最新消息,记者马德兴曝出争议猛料,中超很多外援还不如本土球员水平,致本土球员水准只能更低,这样的情况也是引起了不小的争议。马德兴这样写道这山东泰山输球有内幕?多年跟队记者有人不想争冠和卫冕山东泰山的9连胜被终结了,终结他们的不是武汉三镇,也不是河南嵩山龙门,而是全华班的上海申花。中超第12轮的一场补赛中,山东泰山在4名外援尽出的情况下,最终还是以12输给了1名外援都法国香水来源经济日报谁人不知法式香。法国香水闻名于世,不过,法国并非香水的起源地。香水的历史源远流长。根据史料记载,埃及是香水可考证的起源地。早年间,埃及人将乳香以及天然植物调和在一起,制