公司中提交MYSQL
脚本有相应的规范,需要编写为groovy
文件,同时里面包含了一些其他信息项,有对应版本、编写人、模块编码、日期等等,每次写脚本时都通过拷贝旧文件,再修修改改之后提交,所以错误率比较高,想着通过配置信息项以及通过代码来直接生成对应脚本。完成之后发现,虽然达到了生成脚本的预期,但是交互是在console
控制台上交互,使用上有点繁琐,偶然看到关于IDEA
插件开发的博客,想着是否可以通过IDEA
插件来写一个UI
,生成逻辑直接使用原有代码移植过来。同时记录在开发IntelliJ IDEA
插件过程中遇到的一些问题和踩到的一些坑。
环境准备
IntelliJ IDEA
插件开发有两种方式,一种是直接引入Plugin DevKit
,然后配置IntelliJ Platform Plugin SDK
进行开发,另一种是使用gradle
构建项目并引入IDEA
插件开发包。使用gradle
的好处是同时也可以引入一些其他的库进行使用。
在IDEA 2021.3
以及之后的版本,开发需要使用JDK 11
进行开发,在我开发的时候我本地也没有JDK 11
(一台电脑可以支持多个版本的JDK
,问题在于环境变量配置的是哪个版本而已。因为目前只有这里插件开发我才会用到JDK 11
,所以没有将它添加到环境变量中,仅通过IDEA
工具添加了JDK
路径)。
我使用的是gradle
的方式进行插件的开发。gradle
导入之后,在Libraries
下会有一个com.jetbrains:ideaIC:2021.3
,这就是IDEA
插件的开发包。
1 | plugins { |
gradle
中一些常用项:
intellij -> runIde
:这时会新启动一个IDEA
工具,可以进行调试插件。
intellij -> buildPlugin
:构建插件,用来完成之后将代码打包成.zip
。(路径为build/distributions
)。
辅助工具
点击Help -> Edit Custom Properties...
,添加以下配置后重启IDEA
。
1 | true = |
在Tool
下会出现Interal Actions
和View PSI Structure...
按钮。
参考面板:Internal Actions -> UI -> Show Standard Panels
:会弹出一个UI
面板,结合UI Debug
就可以参考到对应的源码。
通过Internal Actions ->UI Debugger
可以监控在IDEA
中鼠标操作对应的Action
。比如创建一个类,在UI Debugger
面板上可以看到一个CreateClassAction
的类,就可以看到这个创建一个类的源码,如果功能类似甚至可以直接复用。
与PSI
相关API
目前占时没有使用,具体如果需要插件能实现在代码里根据某种规则生成内容,则就需要通过PSI
相关内容进行处理。
工程结构
结构
1 | idea-plugin |
plugin.xml配置
我使用的是ToolWindowFactory
创建右侧窗体。若是创建Action
,可以直接通过New -> Plugin DevKit -> Action
进行创建,通过这种方式创建,会自动在plugin.xml
文件中添加<action>
的配置。
1 | <idea-plugin> |
UI
由于IDEA
插件的UI
采用的是Swing
、Awt
来进行窗体开发,当知道使用的是Swing
一度想要放弃掉,确实是使用Swing
是一件比较痛苦的事情。后借助于IDEA
的Swing UI Designer
功能通过拖拽简单组件的方式,硬着头皮画出了UI
界面。
兼容性问题
1.路径
可能由于项目有别于常用的java
项目、spring
项目,所以在获取资源文件(/resources/**
)时,总是感觉摸不着头脑。参考了一些其他博主写的IDEA
插件项目,获取资源文件的方式,与java
项目、Spring
项目并无差别,但是我在获取资源文件时,一直提交获取不到资源文件,也有可能是velocity
组件的问题。
原本使用velocity
模板引擎来加载对应模板文件,但是一直报错获取不到对应资源文件之后,将这种动作修改为代码层获取到资源文件内容,在将模板内容提交给velocity
模板引擎。
注:velocity
组件和groovy
库相关包在com.jetbrains:ideaIC:20201.3
中已经存在,所以不能由自身再引入。
在调试开发过程中,velocity
正常使用,但是打包成插件之后,通过插件的方式运行,一直报一个日志相关的异常。
添加velocity.proerties
配置文件相关配置
1 | org.apache.velocity.runtime.log.SimpleLog4JLogSystem = |
因为在调试过程的运行和实际插件方式运行是对应的相对路径是不一致的,所以在使用系统级有关的相对路径是需通过使用com.intellij.openapi.application.PathManager
类来获取对应的路径:
比如使用PathManager.getBinPath()
:
在调试运行获取到的路劲为:/usr/local/Cellar/gradle/7.3.1/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/2021.3/75777e10a0e2880bc02945066dda2480a696c3d9/ideaIC-2021.3/bin
在实际插件方式允许获取的路径为:/Applications/IntelliJ IDEA.app/Contents/bin