跳至主要內容

Intellij Plugin

zzz大约 5 分钟

Intellij Plugin

相关信息

记录插件开发的要点,学习如何查看文档,从文档中获取想要的内容。

Intelij Platform 提供了丰富的插件SDK,可以通过内置的扩展点、Action进行扩展,根据不同的需求可能会用到不同种类、数量的扩展点、Action等内容。

这里只记录一个按钮点击的插件需求的开发过程,以此对文档有初步的熟悉。

插件类型

通常有以下几种:

  • 自定义语言支持
  • 框架集成
  • 工具集成
  • 用户界面附加组件
  • 主题

通过了解插件类型open in new window,可以找到不同类型插件的Demo

插件结构

https://plugins.jetbrains.com/docs/intellij/plugin-structure.htmlopen in new window

插件开发

插件开发文档open in new window提供多种开发方式,但官方推荐使用Gradle IntelliJ Pluginopen in new window,其他方式也可以在文档上找到说明。

如果使用此方式,需要安装Gradle,并配置好Gradle环境,然后就可以使用Gradle进行插件开发了。 因此,你需要知道一些Gradle的知识。

提示

Gradle IntelliJ Plugin默认的Gradle配置和开发语言是Kotlin,使用Java可能会出现类找不到的问题。如需使用Java开发,可以在文档中寻找解决方案。

插件配置

plugin.xml是插件开发的核心配置文件,常用的几个配置信息如下:

Depends 平台依赖

<!--plugin.xml-->
<idea-plugin>
    <!--省略其他...-->
    <depends>com.intellij.modules.platform</depends>
    <depends>com.intellij.database</depends>
</idea-plugin>

表示开发依赖的平台,默认是com.intellij.modules.platform,也就是基础平台

如果说想要基于数据库插件做开发,需要增加com.intellij.database 依赖,同时Gradle中也可能需要增加对应依赖,如:

// build.gradle.kts
intellij {
    version.set("2022.2.5")
    type.set("IU") // Target IDE Platform
    plugins.set(listOf("com.intellij.database"))
}




 

更多信息open in new window

除了基础平台外,不同依赖的平台会提供不同的机制——Extensions、Action、Listener、Service等。下面对一些概念做一些简单说明:

Extensions 扩展

扩展是插件扩展 IntelliJ 平台功能的最常见方式,其方式不像向菜单或工具栏添加操作那样简单。扩展点是 IntelliJ 平台中定义的插件可以扩展的 API,扩展点允许您将代码附加到 Intelli。

以下是使用扩展完成的一些最常见的任务:

  • 扩展点允许插件添加工具窗口(显示在 IDE 用户界面两侧的面板);

  • com.intellij.toolWindow和扩展点允许插件将页面添加到“设置”对话框中com.intellij.applicationConfigurablecom.intellij.projectConfigurable;

  • 自定义语言插件使用许多扩展点来扩展IDE中的各种语言支持功能。

平台和捆绑的插件中提供了 1500 多个扩展点,允许自定义 IDE 行为的不同部分。

下面的例子分别配置了通知组件和工具窗口,工具窗口的界面由Swing UI实现:

相关信息

idea Swing UI Designer创建的界面为Java版本,直接使用会出现NoClassDefFoundError,可选择通过Kotlin手工创建Form类或者处理以支持Java编译。

<!--plugin.xml-->
<extensions defaultExtensionNs="com.intellij">
    <notificationGroup id="GetToken" displayType="BALLOON" />

     <toolWindow id="TokenToolWindow" secondary="true" icon="AllIcons.Toolwindows.WebToolWindow" anchor="right"
                 factoryClass="com.zzz.pgn.sfishelper.db.ui.TokenToolWindowFactory"/>
</extensions>

Listener 监听器

IntelliJ 平台提供了一组事件,用于在特定事件发生时通知插件。

侦听器允许插件订阅通过消息总线传递的事件(有关详细信息,请参阅消息传递基础结构)。

侦听器在应用程序(全局)或项目级别定义。

我们可以根据以下菜单对扩展点和侦听器进行查询,参考已有插件的实现来获取思路:

https://plugins.jetbrains.com/docs/intellij/extension-point-list.htmlopen in new window

https://plugins.jetbrains.com/intellij-platform-explorer/extensionsopen in new window

Actions 动作

IntelliJ 平台提供了操作的概念。操作是从 AnAction 派生的类,当选择其菜单项或工具栏按钮时,将调用其actionPerformed方法。

操作是用户调用插件功能的最常见方式。可以使用键盘快捷键或“帮助”|”查找操作...查找。

操作被组织成组,而组又可以包含其他组。一组操作可以构成工具栏或菜单。组的子组可以形成菜单的子菜单。

用户可以通过菜单和工具栏设置自定义所有已注册的操作。

可以通过开启内部模式,使用UI-Inspectoropen in new window,像Chrome开发者工具审查UI元素一样来查看每个按钮、布局的结构,在Mac下使用Control + Option+鼠标左键。

Gradle配置

配置本地仓库、仓库源等信息

⭐ 设置目标IDE Platform

IC ——社区版,默认值

IU——ultimate版本

// build.gradle.kts
intellij {
    version.set("2022.2.5")
    type.set("IU") // Target IDE Platform
    plugins.set(listOf("com.intellij.database"))
}



 


⭐ 设置插件依赖:

// build.gradle.kts
intellij {
    version.set("2022.2.5")
    type.set("IU") // Target IDE Platform
    plugins.set(listOf("com.intellij.database"))
}




 

更多信息open in new window

测试

runIde
runIde
// build.gradle.kts
runIde {
        jvmArgs("--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED")
        jvmArgs("--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED")
    }




 
// build.gradle.kts
tasks {

   test {
        useJUnitPlatform()
    }
}
    




 



编译

buildPluginopen in new window

生成一个可以分享、安装的压缩文件"build/distributions/xxxxx.zip"

验证

runPluginVerifier

发布

publishing-plugin open in new window

uploading-a-new-pluginopen in new window

https://plugins.jetbrains.com/ideaopen in new window

版本兼容

默认内容一般包含:

// build.gradle.kts
tasks {
    // Set the JVM compatibility versions
    withType<JavaCompile> {
        sourceCompatibility = "17"
        targetCompatibility = "17"
    }
    withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "17"
    }

    patchPluginXml {
        sinceBuild.set("222")
        untilBuild.set("233.*")
    }
}

版本兼容主要考虑以下几个方面:

  • JDK版本,一般参考IDE Platform
// build.gradle.kts
tasks {
    // Set the JVM compatibility versions
    withType<JavaCompile> {
        sourceCompatibility = "17"
        targetCompatibility = "17"
    }
    withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "17"
    }
}
// build.gradle.kts
tasks {
    patchPluginXml {
        sinceBuild.set("222")
        untilBuild.set("233.*")
    }
}

资料

Demo