乐趣区

关于java:技术调研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. 根底配置

  1. IntelliJ IDEA 2019.3.1 x64
  2. JDK 须要配置 IntelliJ Platform Plugin JDK,在 Project Setting 中设置,这样才能够失常开发 IDEA 插件
  3. id ‘org.jetbrains.intellij’ version ‘0.6.3’
  4. gradle-5.2.1 与 2019 IDEA 版本下的插件开发匹配
  5. Settings -> Build, Execution,Deloyment -> Build Tools,配置 Gradle。Gradle user home = D:/Program Files (x86)/gradle/gradle-5.2.1/.gradle User 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 构建我的项目后,你会遇到几个问题;

  1. 提前下载好 Gradle 5.2.1 版本并配置上,否则构建工程主动下载会比较慢 https://gradle.org/next-steps/?version=5.2.1&format=all
  2. 构建工程时候拉取相干内容,会比较慢,如果你有代理会好一些。
  3. 【麻烦的问题】基于 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 挪动进去即可。
  4. 【堆栈溢出】在 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 脚手架!
  • 调研字节码插桩技术,用于系统监控设计和实现
  • 小傅哥,一个有“副业”的码农!
退出移动版