技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?

作者:小傅哥
博客:https://bugstack.cn
沉淀、分享、成长,让自己和他人都能有所收获!
一、前言
不踩些坑,根本不是成熟的码农!
你觉得肯德基全家桶是什么?一家人一起吃的桶吗,就那么一点点?不是,肯德基全家桶说的是,鸡的全家桶!
听到这个故事就像有时候我因为需要解决某些问题去搜索、折腾、验证、排除的技术方案,因为方向不对,所以努力也就白费。只能一次次在众多的资料、文档、源码中一点点找到并组合出适合自己的问题场景的技术处理手段。
但这个过程有时候又是必须经历的,很少有时候能一次就找到正确的答案或者人,哪怕开始就找到了,也会再去排查下其他的资料,看看还有没有更好的。是不,这就是你吧?
二、抛出问题
我又要冲IDEA插件开发了!
在研究字节码插桩的相关技术后,考虑着除了通常的用在代码上线后的非入侵式监控外,是不是也可以用于研发在开发阶段对系统接口的提取呢?
带着这个从脑袋中冒出的想法,想到如果要处理这个事情,最核心的问题就是开发一款IDEA插件+字节码插桩能力,在代码运行时对运行方法增强,提取相关的必要信息。别说案例还真做出来了,如下:

- 案例地址:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
- 后续问题:其实实现到这里还只能算是一个案例,对于 IDEA 插件开发能力并没有完全弄透,比如这个 IDEA 插件需要做一些基础配置,那么在哪里打开呢?还有实时监控并产生的接口信息能在 IDEA 界面右侧展示出来或者支持导出吗?如果我再有一些集合 IDEA 插件开发的能力做的其他的功能引入咋办呢?这里用到了哪些技术呢?等等,这些问题都需要去一一解决掉,才能完完整整的开发一个可用的 IDEA 插件,为此,需要做更深入的资料整理和实践验证。
三、开发插件涉及的问题
问题汇总:开发一个 IDEA 插件基本要涉及到的问题过程如下:

- 开发方式:在官网的描述中,创建IDEA插件工程的方式有两种分别是,IntelliJ Platform Plugin 模版创建和 Gradle 构建方式。
- 框架入口:一个 IDEA 插件开发完,要考虑把它嵌入到哪,比如是从 IDEA 窗体的 Edit、Tools 等进入配置还是把窗体嵌入到左、右工具条还是IDEA窗体下的对话框。
- UI:思考的是窗体需要用到什么语言开发,没错,用的就是 Swing、Awt 的技术能力。
- API:在 IDEA 插件开发中,一般都是围绕工程进行的,那么基本要从通过 IDEA 插件 JDK 开发能力中获取到工程信息、类信息、文件信息等。
- 外部功能:这一个是用于把插件能力与外部系统结合,比如你是需要把拿到的接口上传到服务器,还是从远程下载文件等等。
四、开发插件的两种配置
- 官方文档:https://plugins.jetbrains.com/docs/intellij/disposers.html
- 官方案例:https://github.com/JetBrains/intellij-sdk-docs
1. 基础配置
IntelliJ IDEA 2019.3.1 x64
JDK 需要配置 IntelliJ Platform Plugin JDK,在 Project Setting 中设置,这样才可以正常开发 IDEA 插件
id 'org.jetbrains.intellij' version '0.6.3'
gradle-5.2.1
与 2019 IDEA 版本下的插件开发匹配Settings -> Build, Execution,Deloyment -> Build Tools,配置 Gradle。Gradle user home =
D:/Program Files (x86)/gradle/gradle-5.2.1/.gradleUser Gradle from =gradle-wrapper.properties或者Specified location具体如下图:
如果你是使用 IDEA New Project 默认的 IntelliJ Platform Plugin 方式,其实只关注1、2两步骤就可以了,但如果你需要 Gradle,那么需要注意3、4、5步骤的设置。当然通常也更推荐使用 Gradle 来搭建工程,这样你在需要一些额外的 Jar 包时候,只需要在 Gradle build.gradle 配置即可,而不是把需要的 Jar 包复制到工程的 lib 下。
2. 遇到问题
在使用 Gradle 构建项目后,你会遇到几个问题;
- 提前下载好 Gradle 5.2.1 版本并配置上,否则构建工程自动下载会比较慢 https://gradle.org/next-steps/?version=5.2.1&format=all
- 构建工程时候拉取相关内容,会比较慢,如果你有代理会好一些。
- 【麻烦的问题】基于 Gradle 的 IDEA 插件开发会在构建过程中,会下载一个匹配版本的 IDEA 软件用于启动测试开发插件,几百兆那种zip包
ideaIC-2019.3.1.zip。这个时候基本你会遇到一个崩溃的报错Could not resolve all files for configuration ':detachedConfiguration1'.咋办呢,如果你不嫌弃麻烦可以手动下载并SHA1加密后把下载的文件放到缓存文件夹中.gradle\caches\modules-2\files-2.1具体操作如下:- 打开系统盘下当前用户的
.gradle目录,进入.gradle\caches\modules-2\files-2.1目录,即为缓存文件的目录。这个目录是你的报错构建过程中的报错地址,Could not get resource D:\Program Files (x86)\gradle\gradle-5.2.1\.gradle\caches\modules-2\files-2.1\com.jetbrains.intellij.idea\ideaIC\2019.3.1 - 加密文件夹
2dae8e50d4b0508cad2e680b53414f657954f390目录名称(你的可能不是这样的),我去,这个应该是加密过的,但是是什么加密呢?,经过了解知道了这个是SHA1加密,且是对文件进行SHA1的加密生成的唯一字符串,但是windows上没有这个命令,在线SHA1也太麻烦了,还要上传文件,于是想到了Java的API,还有就是通过git hash命令行来实现。 把我们的文件ideaIC-2019.3.1.zip先临时拷贝到这个目录。运行sha1sum.exe ideaIC-2019.3.1.zip命令,生成唯一的唯一字符串(用来校验文件的完整性),这样就拿到这个2dae8e50d4b0508cad2e680b53414f657954f390目录名 - 接下来在
2019.3.1目录下,新建目录2dae8e50d4b0508cad2e680b53414f657954f390,将ideaIC-2019.3.1.zip移动进去即可。
- 打开系统盘下当前用户的
- 【堆栈溢出】在 Gradle 构建的过程中,消耗内存较大,可能会报错
Java heap space所以也可以 在IDEA项目根目录下,新建文件gradle.properties,添加如下内容,变更gradle Jvm参数org.gradle.jvmargs=-Xmx2024m -XX:MaxPermSize=512m别说还挺好用,竟然构建成功了。
五、写个测试案例
1. 工程结构
PluginGuide
├── .gradle
└── src
├── main
│ └── java
│ ├── HiClazz.java
│ ├── MyDumbAwareAction.java
│ ├── MySearchableConfigurable.java
│ ├── MyToolWindowFactory.java
│ └── TestUI.java
└── resources
├── icons
└── META-INF
└── plugin.xml
- HiClazz 是继承 AnAction 的实现类,用于附着到 IDEA 的窗体上,点击后打开对应页面
- MyDumbAwareAction、MyToolWindowFactory,配合使用,用于在 IDEA 最下面的窗体设置,与你看见的控制台输出信息位置一样。
- MySearchableConfigurable,可以用于 Settings 中配置窗体。
- TestUI 是基于 Swing 开发的窗体,验证在 AnAction 实现类中打开。
- plugin.xml 是整个 IDEA 咖啡的配置文件,你所有的窗体都会在这个配置文件里有所体现。
2. AnAction
public class HiClazz extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(PlatformDataKeys.PROJECT);
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
String classPath = psiFile.getVirtualFile().getPath();
String title = "Hello World!";
Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon());
}
}
- 测试在 IDEA 中读取鼠标停留在类文件中的信息。我们可以把这个 AnAction 配置到各个 IDEA 菜单中。
3. MyToolWindowFactory
public class MyToolWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
toolWindow.setToHideOnEmptyContent(true);
class MyPanel extends SimpleToolWindowPanel {
public MyPanel(boolean vertical) {
super(vertical);
DefaultActionGroup group = new DefaultActionGroup();
group.add(new MyDumbAwareAction("Login1"));
group.add(new MyDumbAwareAction("Login2"));
group.add(new MyDumbAwareAction("Login3"));
ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("ToolBar", group, false);
setToolbar(toolbar.getComponent());
}
}
// 添加一个页
toolWindow.getContentManager().addContent(ContentFactory.SERVICE.getInstance().createContent(new MyPanel(false), "First", false), 0);
}
}
- 在 IDEA 的最下面窗体中,如果想展示自己的窗体,则需要开发对应的 ToolWindowFactory 实现类,这样才可以展示你的内容。
- 这里的思想基本是 Swing 技术的开发方式,如果你不熟悉 Swing 最这块内容会比较陌生。
4. plugin.xml
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<toolWindow canCloseContents="true" anchor="bottom"
id="SmartIM"
factoryClass="MyToolWindowFactory">
</toolWindow>
<!-- 在Setting中添加自定义配置模版 -->
<projectConfigurable groupId="Other Settings" displayName="My Config" id="thief.id"
instance="MySearchableConfigurable"/>
</extensions>
<actions>
<!-- Add your actions here -->
<action id="HiId_FileMenu" class="HiClazz" text="HiName">
<add-to-group group-id="FileMenu" anchor="first"/>
<add-to-group group-id="MainMenu" anchor="first"/>
<add-to-group group-id="EditMenu" anchor="first"/>
<add-to-group group-id="ViewMenu" anchor="first"/>
<add-to-group group-id="CodeMenu" anchor="first"/>
<add-to-group group-id="AnalyzeMenu" anchor="first"/>
<add-to-group group-id="RefactoringMenu" anchor="first"/>
<add-to-group group-id="BuildMenu" anchor="first"/>
<add-to-group group-id="RunMenu" anchor="first"/>
<add-to-group group-id="ToolsMenu" anchor="first"/>
<add-to-group group-id="WindowMenu" anchor="first"/>
<add-to-group group-id="HelpMenu" anchor="first"/>
</action>
<action id="HiId_EditorPopupMenu" class="HiClazz" text="HiName">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
<action id="HiId_MainToolBar" class="HiClazz" text="HiName">
<add-to-group group-id="MainToolBar" anchor="first"/>
</action>
</actions>
- 在 plugin.xml 的配置中,主要是把各个功能实现窗体配置到对应的菜单下,比如 Tools 下、toolWindow 里等。
5. 测试结果
启动运行

- IDEA 插件开发运行会基于 Plugin 或者 Gradle 下配置的
::runIde
运行界面

- 在 IDEA 的各个菜单中都可以看到新增加的 HiName 插件,在你实际开发的时候选择需要的内容进行配置即可。
运行效果

- 当鼠标点到类的上,在点 HiName 就可以看到对应的工程类信息了。
六、插件开发能做啥都
在 GitHub 上搜索 IDEA 插件开发,一共有44页内容,https://github.com/search?p=41&q=idea%E6%8F%92%E4%BB%B6&type=Repositories 涉及到自动化测试、工程脚手架、API生成、生成数据库的DAO类、一些常用工具,当然还有一些比较有意思的,比如:摸鱼看书、听郭德纲相声、微信聊天、局域网聊天、英语翻译等等。这里我给大家列举几个,开阔开阔思路。
1. 快速生成 CRUD 工程代码

- 地址:https://github.com/mars05/crud-intellij-plugin
- 描述:一个增删改查的idea插件,可以根据数据库表结构,帮助您快速生成model、dao、service、controller等相关代码。同时支持MyBatis、JPA、MybatisPlus。
2. 在 IDEA 中摸鱼聊天

- 地址:https://github.com/Jamling/SmartIM4IntelliJ
- 描述:ntelliJ IDEA上的SmartIM(原SmartQQ)插件,可以在IDEA中使用QQ或微信聊天。安装成功后,会在底部栏出现一个SmartIM的tab(如果没有底部栏,则在菜单View中把ToolButtons勾选上)
3. 可视化流程编排

- 地址:https://github.com/alibaba/compileflow
- 描述:
compileflow Process引擎是淘宝工作流TBBPM引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。在阿里巴巴中台解决方案中广泛使用,支撑了导购、交易、履约、资金等多个业务场景。
七、总结
- IDEA 开发技术涉及到了对 IDEA 插件开发 API 的熟悉以及UI界面的开发,所以如果想开发一款 IDEA 插件,基本离不开对 Swing 的编写,不过也不需要太复杂的页面,所有这部分技能还好。
- IDEA 官网文档仅提供了两种构建 IDEA 插件工程的方法,但更推荐 Gradle 方式,这样可以满足你对后续其他功能组件的便捷引入,以及做其他内容的扩展。
- IDEA 插件开发可以开发出很多用于提效研发编程的技术插件,例如一些监控、脚手架、接口API以及调试、流程化低代码编排等等,所以这部分内容的价值还是蛮大的。
八、系列推荐
- 基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
- 关于低代码编程的可持续性交付设计和分析
- 不重复造轮子都是骗小孩的,教你手撸 SpringBoot 脚手架!
- 调研字节码插桩技术,用于系统监控设计和实现
- 小傅哥,一个有“副业”的码农!
技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?的更多相关文章
- 企业应用开发的大趋势,65%的应用开发将通过低代码完成 ZT
全球知名的咨询公司Gartner于近日发表了最新版的<低代码开发平台魔力象限>,并在报告中指出,到2024年65%的应用开发工作都将通过低代码的方式完成.Gartner长期关注软件开发领域 ...
- 为企业应用开发提速,写给企业IT部门的低代码开发基础知识
简介:应用程序开发长期以来一直是IT部门和业务部门面临的问题. IT部门总是被新的应用程序需求弄得不堪重负.他们不可能完成业务部门想要完成的每一个项目. 同时,业务部门的用户厌倦了等待,并开始完全绕过 ...
- JELLY技术周刊 Vol.24 -- 技术周刊 · 实现 Recoil 只需百行代码?
蒲公英 · JELLY技术周刊 Vol.24 理解一个轮子最好的方法就是仿造一个轮子,很多框架都因此应运而生,比如面向 JS 开发者的 AI 工具 Danfo.js:参考 qiankun 的微前端框架 ...
- 开源低代码平台开发实践二:从 0 构建一个基于 ER 图的低代码后端
前后端分离了! 第一次知道这个事情的时候,内心是困惑的. 前端都出去搞 SPA,SEO 们同意吗? 后来,SSR 来了. 他说:"SEO 们同意了!" 任何人的反对,都没用了,时代 ...
- 低代码开发Paas平台时代来了
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 低代码理论 概念 低代码开发基于可视化和模型驱动的概念,结合了云原生和多终端体验技术,它可以在大多数业务场景中,帮助企业显著 ...
- APICloud发布低代码开发平台
云原生的出现,致使传统IT模式正在集中向云架构.云开发转型,其中在企业业务的互联网化.数字化进程中尤为突出,并衍生出“敏捷开发”.“快速迭代”的刚性需求.面对双模IT,如何打造全新的IT团队与模式?并 ...
- 从表单驱动到模型驱动,解读低代码开发平台的发展趋势 ZT
原文地址:https://www.grapecity.com.cn/blogs/read-the-trends-of-low-code-development-platforms 随着社会数字化进程的 ...
- 用友低代码开发平台YonBuilder首次亮相DevRun开发者沙龙
2020年的今天,没有人会再质疑企业上云的必要性与价值所在.从高科技行业到传统领域,大大小小的企业都希望走在变革道路前列,通过企业云加快业务数字化转型,更好地维护和管理企业数据. 然而,大多数企业都很 ...
- 破解“低代码”的4大误区,拥抱低门槛高效率的软件开发新选择 ZT
最近,每个人似乎都在谈论“低代码”.以美国的Outsystems.Kinvey,以及国内的活字格为代表的低代码开发平台,正在风靡整个IT世界.毕竟,能够以最少的编码快速开发应用的想法本身就很吸引人.但 ...
随机推荐
- 使用Pycharm创建Django项目无法创建app.
Python3.7使用Django1.11.7创建Django项目报以下错误时: 在使用Pycharm创建Django项目报以下错误时: Traceback (most recent call las ...
- 第十篇 -- 下拉列表框QComboBox
效果图: ui_ComboBox.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui ...
- 使用分区助手转移windows 10系统出现黑屏boot manager报错问题。
问题原因: 在使用分区助手迁移windows 10到ssd中,设置完boot管理器后,出现黑屏问题, 经过长时间的搜索,发现在迁移系统的时候,只迁移了C盘的系统,没有连同msr引导 文件一同传过去,会 ...
- SQL 查询总是先执行SELECT语句吗?你们都错了!
SELECT语句中子句的顺序.SELECT语句中使用时必须遵循的次序. 经过一段时间的学习,我们知道了SELECT语句超简版的语法如下: SELECT 字段名 FROM 表名 后来,我们又陆续学习了W ...
- [.NET大牛之路 005] .NET 的执行模型
.NET大牛之路 • 王亮@精致码农 • 2021.07.06 前面我们介绍 .NET 历史时讲过,微软基于 .NET Framework 重新设计并创造了跨平台的 .NET Core,目前已经发展到 ...
- 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)
前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用. 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spri ...
- 又一开源项目爆火于GitHub,Android高级插件化强化实战
一.插件化起源 插件化技术最初源于免安装运行 Apk的想法,这个免安装的 Apk 就可以理解为插件,而支持插件的 app 我们一般叫 宿主. 想必大家都知道,在 Android 系统中,应用是以 Ap ...
- 线程的分离状态(detached state)
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: [cpp] view plaincopyprint? int pt ...
- Vue-cli4 唤醒摄像头扫描二维码
<template> <div class="scan"> <div id="bcid"> <div id=" ...
- awk-05-数组
数组 数组: 存储一系列相同类型的元素,键/值方式存储,通过下标(键)来访问值 awk 中数组称为关联数组,不仅可以使用数字作为下标,还可以使用字符串作为下标 数组元素的键和值存储在 awk 程序内部 ...