前言

大家都常常应用 IDEA 进行开发,必定会应用一些 IDEA 插件,我之前也写过两个插件,不过曾经很久没有更新了,就让它先放着吧!

那小伙伴你是否想亲手写一个插件,或者你是否有一些插件的想法,然而找不到插件。那就本人实现一个吧!

公众号:『 刘志航 』,记录工作学习中的技术、开发及源码笔记;时不时分享一些生存中的见闻感悟。欢送大佬来领导!

创立我的项目

应用 Gradle 创立

写插件,先从创立我的项目开始:

File -> New -> Project...

  • 这里应用 Gradle,其中 Java 曾经默认选中,咱们再额定抉择 IntelliJ Platform Plugin

  • 点击 Next ,而后填写项目名称,门路等选项。

  • 我的项目构造

build.gradle 为我的项目配置文件。
resources/META-INF/plugin.xml 为插件配置文件。

应用 GitHub 模版

  1. 拜访 https://github.com/JetBrains/...
  2. 点击 Use this template 创立模版。
  3. Clone 我的项目到本人本地。

注:模版生成的我的项目是应用的 Kotlin,所以这里应用的第一种形式创立。

开始开发

批改 build.gradle 配置文件

原内容如下:

批改后:

plugins {    id 'java'    id 'org.jetbrains.intellij' version '0.4.15'}group 'com.liuzhihang.toolkit'version '1.0.2'sourceCompatibility = 1.8repositories {    mavenLocal()    maven { url "https://maven.aliyun.com/repository/public" }    mavenCentral()    jcenter()}dependencies {    testCompile group: 'junit', name: 'junit', version: '4.12'}// See https://github.com/JetBrains/gradle-intellij-plugin/intellij {    version '2019.1.1'    pluginName 'Copy as Json'    updateSinceUntilBuild false    sameSinceUntilBuild false}patchPluginXml {    pluginDescription(file(descriptionFile).text)    changeNotes(file(changesFile).text)}
  1. 批改 repositories 应用阿里云
  2. 批改 patchPluginXml 应用外置文件
  3. 根目录下创立 parts 门路,并创立 changeNotes.htmlpluginDescription.html

批改 resources/META-INF/plugin.xml 插件信息

原内容如下:

批改后:

<idea-plugin>    <id>com.liuzhihang.toolkit.copyasjson</id>    <name>Copy as Json</name>    <vendor email="liuzhihangs@qq.com" url="https://liuzhihang.com">Liu ZhiHang</vendor>    <description><![CDATA[ Description will be added by gradle build]]></description>    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html         on how to target different products -->    <depends>com.intellij.modules.java</depends>    <idea-version since-build="181.00"/>    <extensions defaultExtensionNs="com.intellij">        <!-- Add your extensions here -->    </extensions>    <actions>    </actions></idea-plugin>

plugin.xml 阐明:https://jetbrains.org/intelli...

创立 Action

  1. 先在 main 下 创立 java 目录,及包门路。
  2. New -> Plugin DevKit -> Action
  3. 设置 Action 的 idClass Namedescriptiongroup快捷键
  4. 这时候会发现在 plugin.xml 也插入了 action
<actions>    <action id="Toolkit.Json.CopyAsJsonAction" class="com.liuzhihang.toolkit.action.CopyAsJsonAction"            text="CopyAsJsonAction" description="Copy As Json">        <add-to-group group-id="EditorTabsGroup" anchor="first"/>        <keyboard-shortcut keymap="$default" first-keystroke="shift meta J"/>    </action></actions>

到这里曾经构造齐全创立结束了,上面将演示插件 copy-as-json 的外部逻辑。当然这块也能够间接跳过,浏览源码即可。

源码地址:文末相干材料或公众号发送 copy-as-json 获取。

插件成果:将 JavaBean 复制为 Json 字符串。

开发笔记

首先须要晓得一些罕用的 API,罕用 API 能够浏览官网文档或者关注公众号前面会推送,这里仅介绍一些在这里用到的。

  • 关上 CopyAsJsonAction

该类继承并须要实现 actionPerformed 办法。在 actionPerformed 办法中能够通过以下三个办法获取到我的项目相干信息:

// 获取我的项目Project project = e.getData(PlatformDataKeys.PROJECT);// 获取Psi文件PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);// 获取以后编辑的文件Editor editor = e.getData(CommonDataKeys.EDITOR);
  • 获取到以后编辑的文件
@Nullablepublic static PsiClass getTargetClass(@NotNull Editor editor, @NotNull PsiFile file) {    int offset = editor.getCaretModel().getOffset();    PsiElement element = file.findElementAt(offset);    if (element != null) {        // 以后类        PsiClass target = PsiTreeUtil.getParentOfType(element, PsiClass.class);        return target instanceof SyntheticElement ? null : target;    }    return null;}
  • 从以后编辑的文件外面获取到字段

将以后编辑的 JavaBean 中的字段提取,并转换为 Map。

Map<String, Object> fieldsMap = getFields(selectedClass);

getFields 办法篇幅较长,请参考源码。

  • 将字段转化成 Json 字符串,并格式化

应用 Gson 将 Map 转换为 Json 字符串,并格式化。其中格式化自定义了缩进。

见代码:com.liuzhihang.toolkit.utils.GsonFormatUtil

Gson gson = new GsonBuilder().create();String json = GsonFormatUtil.gsonFormat(gson, fieldsMap);// 应用自定义缩进格局 String json = new GsonBuilder().setPrettyPrinting().create().toJson(fieldsMap);StringSelection selection = new StringSelection(json);
  • 将 Json 字符串拷贝到剪贴板
StringSelection selection = new StringSelection(json);Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();clipboard.setContents(selection, selection);
  • 收回提醒 success
String message = "Convert " + selectedClass.getName() + " to JSON success, copied to clipboard.";Notification success = NOTIFICATION_GROUP.createNotification(message, NotificationType.INFORMATION);Notifications.Bus.notify(success, project);

测试运行

右侧 Gradle -> 抉择 intellij -> 点击 runlde

打包

右侧 Gradle -> 抉择 intellij -> 点击 buildPlugin

此时在我的项目门路下会生成插件,把这个插件包发给小兄弟装置应用就行了。

上传到 IDEA 插件库

拜访 https://plugins.jetbrains.com/ 创立账号,将插件包上传到仓库即可。当然也有其余的形式,这块就没有钻研了。

总结

通过下面的形式曾经简略开发一个插件了,要问这个插件有什么用?

其实就是在写文档,或者接口调用的时候,间接将 Java Bean 复制为 Json 串,省过一个一个敲,而后手写 Json 了。

相干材料

[1] IntelliJ Platform SDK DevGuide:https://jetbrains.org/intelli...
[2] JetBrains Plugins Repository:https://plugins.jetbrains.com/
[3] Toolkit: https://github.com/liuzhihang...
[4] copy-as-json:https://github.com/liuzhihang...
[5] copy-as-json 插件地址:https://plugins.jetbrains.com...