idea插件开发基础介绍

最近一段时间学习了一下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中文开发文档地址,翻译的还是比较详细的

概览 | idea插件开发文档 (ideaplugin.com)

相关推荐
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯6 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
i学长的猫8 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636028 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao8 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
Cherry Zack8 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django
爱读源码的大都督9 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈9 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端