最近一段时间学习了一下idea的插件开发相关,同时也写了一个自己的插件,方便自己在工作中使用。写的时候发现idea插件国内的资料也不太多,所以打算写一篇整理一下插件开发的要点
1.整体介绍
从业务开发角度来讲,我认为idea插件可以分为两部,一部分为可视化窗口,一部分为扩展点和监听器实现(需配置在plugin.xml中)
1.1文件目录介绍
less
doc-demo
├── build.gradle //gradle配置文件,详解看下面
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle //项目名称
└── src
├── main
│ ├── java
│ └── resources
│ └── META-INF
│ └── plugin.xml
└── test
├── java
└── resources
进行扩展点监听器等的配置,整体配置demo如下
xml
<!-- url 是可选的,会在页面显示插件的home -->
<idea-plugin url="https://example.com/my-plugin-site">
<!--
插件的唯一id,应该设置为全限定名称,不能和其它插件冲突,
在更新插件版本的时候,不能修改id,
如果不设置,会使用name(不推荐)
-->
<id>com.example.myplugin</id>
<!-- 插件名称 -->
<name>My Framework Support</name>
<!-- 插件版本,可以去 https://jubianchi.github.io/semver-check 检查自己的版本号是否合规 -->
<version>1.0.0</version>
<!-- 作者信息,url是作者homepage -->
<vendor
url="https://plugins.jetbrains.com/my-company"
email="contact@example.com">My Company</vendor>
<!--
收费插件需要用到,免费插件不需要配置,也可以在收费插件中设置免费功能,了解更多查看 https://plugins.jetbrains.com/build-and-market
-->
<product-descriptor
code="PMYPLUGIN"
release-date="20210901"
release-version="20211"
optional="true"/>
<!-- 限制idea版本,在idea哪些版本中可以使用,可以不设置,默认跟 build.gradle中定义的intellij.version的限制相同 -->
<idea-version since-build="193" until-build="193.*"/>
<!--
idea的介绍,可以使用html标签,如果使用html标签,必须用 <![CDATA[ ]]> 包装 ,了解更多 https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description
-->
<description>
<![CDATA[
Provides support for <a href="https://example.com/my-framework">My
Framework</a>.
<p>Includes support for:
<ul>
<li>code completion</li>
<li>references</li>
<li>refactoring</li>
</ul>
</p>
]]>
</description>
<!-- 描述新版本的功能,可以使用html标签,如果使用html标签,必须用 <![CDATA[ ]]> 包装 -->
<change-notes>Initial release of the plugin.</change-notes>
<!--为IDE指定需要依赖的其它插件或模块 ,如果目标IDE不包含该依赖,插件不能正常运行-->
<depends>com.intellij.modules.platform</depends>
<depends>com.example.third-party-plugin</depends>
<!--可选的,如果安装了com.example.my-second-plugin插件,mysecondplugin.xml(格式和plugin.xml一样)配置才会加载 -->
<depends
optional="true"
config-file="mysecondplugin.xml">com.example.my-second-plugin</depends>
<!--
加载配置文件,下面配置表示 /messages/MyPluginBundle.properties 会被加载, "action.[ActionID].text|description" 中的ActionID可以使用,
https://www.ideaplugin.com/idea-docs/Part%20I%20%E6%8F%92%E4%BB%B6/PluginStructure/Extension%20Points.html#%E7%A4%BA%E4%BE%8B 中的 带 @Attribute注解的成员变量也可以用
-->
<resource-bundle>messages.MyPluginBundle</resource-bundle>
<!--
定义扩展点,其它插件可以通过这个扩展点来提供某些数据
https://www.ideaplugin.com/idea-docs/Part%20I%20%E6%8F%92%E4%BB%B6/PluginStructure/Extension%20Points.html
-->
<extensionPoints>
<extensionPoint
name="testExtensionPoint"
beanClass="com.example.impl.MyExtensionBean"/>
<applicationService
serviceImplementation="com.example.impl.MyApplicationService"/>
<projectService
serviceImplementation="com.example.impl.MyProjectService"/>
</extensionPoints>
<!--
Application-level 应用级的监听器.
https://www.ideaplugin.com/idea-docs/Part%20I%20插件/PluginStructure/Listeners.html#注册应用级-application-level-监听器
-->
<applicationListeners>
<listener
class="com.example.impl.MyListener"
topic="com.intellij.openapi.vfs.newvfs.BulkFileListener"/>
</applicationListeners>
<!--
Project-level 项目级的监听器.
https://www.ideaplugin.com/idea-docs/Part%20I%20插件/PluginStructure/Listeners.html#注册项目级-project-level-监听器
-->
<projectListeners>
<listener
class="com.example.impl.MyToolwindowListener"
topic="com.intellij.openapi.wm.ex.ToolWindowManagerListener"/>
</projectListeners>
<!--
Actions 操作. 了解更多,请看:
https://www.ideaplugin.com/idea-docs/Part%20II%20%E2%80%94%20Base%20Platform/Actions/
-->
<actions>
<action
id="VssIntegration.GarbageCollection"
class="com.example.impl.CollectGarbage"
text="Collect _Garbage"
description="Run garbage collector">
<keyboard-shortcut
first-keystroke="control alt G"
second-keystroke="C"
keymap="$default"/>
</action>
</actions>
<!-- 自定义扩展 https://www.ideaplugin.com/idea-docs/Part%20I%20%E6%8F%92%E4%BB%B6/PluginStructure/Extensions.html -->
<extensions defaultExtensionNs="VssIntegration">
<myExtensionPoint implementation="com.example.impl.MyExtensionImpl"/>
</extensions>
</idea-plugin>
1.2可视化窗口
可视化窗口是基于java的swing进行开发,idea支持可视化拖拽,或者自定义实现
可视化界面
自定义实现
1.3扩展点&监听器
扩展点&监听器就是用来处理窗口展示和业务逻辑的地方,例如将窗口展示在编译器界面的右侧 则需要实现ToolWindowFactory接口
并在对于的plugin.xml中进行配置
即可将对于的窗体显示到编译器上
idea官网对所有的监听器或者扩展点的功能没有进行太多介绍,这点需要自己额外费点心思。但是com.intellij.generalEditorOptionsExtension - IntelliJ Platform Explorer | JetBrains Marketplace idea提供了所有扩展点和监听器对应的开源项目集合,可以在其中找到你需要的实现的扩展点或者监听器的实例
2.项目的创建
idea推荐使用gradle进行开发,所以我使用的也是gradle进行开发
2.1 使用Gradle向导创建项目
2.2 拉取github官方插件模板
两种方式无论哪种,都可以快速创建插件开发模板
最后
推荐一个idea中文开发文档地址,翻译的还是比较详细的