第1节:IDEA 插件怎么开发 作者:小傅哥
博客: https://bugstack.cn (opens new window) 原文: https://mp.weixin.qq.com/s/ckbu4ej4P2fEA8D_5cNUpw (opens new window) 沉淀、分享、成长,让自己和他人都能有所收获!😄 # 一、前言 不踩些坑,根本不是成熟的码农! 你觉得肯德基全家桶是什么?一家人一起吃的桶吗,就那么一点点?不是,肯德基全家桶说的是,鸡的全家桶! 听到这个故事就像有时候我因为需要解决某些问题去 搜索 、 折腾 、 验证 、 排除 的技术方案,因为方向不对,所以努力也就白费。只能一次次在众多的资料、文档、源码中一点点找到并组合出适合自己的问题场景的技术处理手段。 但这个过程有时候又是必须经历的,很少有时候能一次就找到正确的答案或者人,哪怕开始就找到了,也会再去排查下其他的资料,看看还有没有更好的。 是不,这就是你吧? # 二、抛出问题 我又要冲IDEA插件开发了! 在研究字节码插桩的相关技术后,🤔考虑着除了通常的用在代码上线后的非入侵式监控外,是不是也可以用于研发在开发阶段对系统接口的提取呢? 带着这个从脑袋中冒出的想法,想到如果要处理这个事情,最核心的问题就是开发一款IDEA插件+字节码插桩能力,在代码运行时对运行方法增强,提取相关的必要信息。别说案例还真做出来了,如下:
案例地址: 基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析 (opens new window) 后续问题:其实实现到这里还只能算是一个案例,对于 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 (opens new window) 官方案例: https://github.com/JetBrains/intellij-sdk-docs (opens new window) # 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/.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 构建项目后,你会遇到几个问题; 提前下载好 Gradle 5.2.1 版本并配置上,否则构建工程自动下载会比较慢 https://gradle.org/next-steps/?version=5.2.1&format=all (opens new window) 构建工程时候拉取相关内容,会比较慢,如果你有代理会好一些。 【麻烦的问题】基于 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 目录名称(你的可能不是这样的),我去,这个应该是 加密 (opens new window) 过的,但是是什么加密呢?,经过了解知道了这个是 SHA1 加密,且是对文件进行 SHA1 的加密生成的唯一 字符串 (opens new window) ,但是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
1 2 3 4 5 6 7 8 9 10 11 12 13 14