Idea插件开发(一)——插件的分类及基础认识
Idea插件开发(二)——插件的创建打包及发布
Idea插件开发(三)——插件JSL的完整开发过程
上篇主要介绍了通过两种模式创建、打包、发布插件,本篇我将记录自己写的插件 JSL 完整的开发过程,插件开发也遵从软件开发流程,同样拥有开发周期和迭代升级的维护周期,当然这完全取决于开发者。
JSL(Jpa Sql Log)
插件开源地址
- Jpa Sql Log:https://github.com/jwwam/jpa-sql-log
插件功能描述
- 这是我开发的一个类似mybatis log plugin的插件,说到这儿应该很多人都能猜到是什么了,我简要的说明下:我们知道ORM映射框架有很多,比较出名的有MyBatis、Hibernate、SpringDataJpa、JdbcTemplate等,这里我就是针对Jpa开发的一个控制台Sql语句还原的插件。因为Jpa开启sql日志后输出的都是带问号的sql,这个缺点和mybatis一样,所以受到mybatis log plugin插件的启发,于是开发了Jpa Sql Log这个插件。
插件截图
插件实现功能
例1: 将 select * from table where _id=?
转换为 select * from table where _id=1
例2: 将 update table set create_date=?, update_date=?, product_id=?, status=? where id=?
转换为 update table set create_date=2020-07-01 11:48:12.0, update_date=2020-07-01 11:48:12.0, product_id=1, status=0 where id=1
实现思路
因为我是针对IDEA开发的,所以我以IDEA的界面来介绍插件开发思路。
- 控制台根据工具栏的选择显示不同的内容,因此我的实现思路首先就是在工具栏放一个工具,取名JSL(Jpa Sql Log),当用户点击按钮时显示一个Console窗口,当Run窗口中的日志出现sql日志时将其和参数值拼接后输出到我的JSL窗口中。看起来很简单,实现起来也不复杂,只是在实现过程中遇到些问题找不到解决办法很花时间,所以才想记录下来。
这里有一点,我们知道Java也有自己的界面编程API,即Java Swing,它允许用户编写带有按钮、输入框、表格等元素的窗口程序,其实这里我编写Console的窗口就是用Java Swing的JComponent组件,在其中放置了一个ConsoleView组件用于输出Text形式的内容。
配置插件触发入口
首先回顾一下插件包目录的内容:
└── plugins
└── sample.jar
├── com/foo/...
│ ...
│ ...
└── META-INF
├── plugin.xml
├── pluginIcon.svg
└── pluginIcon_dark.svg
以下为插件JSL的目录:
plugin.xml作为核心文件记录了整个插件的关键配置信息,首先就是插件触发入口,被称为Action,在plugin.xml如下配置(完整的plugin.xml文末记录):
<actions>
<!-- Add your actions here -->
<action id="cn.feelcode.jpa.JpaSqlLogAction" class="cn.feelcode.jpa.JpaSqlLogAction" text="jpa sql log"
description="格式化jpa生成的log,拼接为标准sql语句" icon="/icons/logo2_1616.png">
<add-to-group group-id="ConsoleView.PopupMenu" anchor="last"/>
</action>
</actions>
Action可以有多个,在菜单栏,工具栏都可以添加,如上我注册了插件JSL的启动方式,Action包含一些基本属性,必须配置
- id指定Action的标识
- class指定Action的实现类
- text表示文本的内容
- description为描述
- icon为图标路径
添加add-to-group
标签,指定触发插件的形式,group-id="ConsoleView.PopupMenu"
表示在控制台右键中添加该Action,anchor
表示位置,last
就是放在最末尾,最终的效果如图:
右键时菜单最后显示为我设置的内容,左下角显示了description信息。
触发方式有很多种,大概分三种:工具栏、菜单栏、快捷键。具体可以查看这里,下面会讲如何变更触发方式
Groups包含了所有的触发形式,下方的keyboard shortcuts支持快捷键触发。
输入group-id后会有自动补全代码功能弹出选择项,此时可以更改触发方式
还可以通过Action类,首先创建包路径cn.feelcode.jpa
,新建JpaSqlLogAction继承AnAction
package cn.feelcode.jpa;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
i