ToB企服应用市场:ToB评测及商务社交产业平台

标题: Intellij IDEA 插件开发 [打印本页]

作者: 大号在练葵花宝典    时间: 2023-6-28 13:43
标题: Intellij IDEA 插件开发
写在前面

很多idea插件文档更多的是介绍如何创建一个简单的idea插件,本篇文章从开发环境、demo、生态组件、添加依赖包、源码解读、网络请求、渲染数据、页面交互等方面介绍,是一篇能够满足基本的插件开发工程要求的文章。
如有疏漏欢迎指正,如想深入了解欢迎探讨。
一、简介

IntelliJ <action id="Generate" />IDEA <action id="Generate" />与 <action id="Generate" />IntelliJ <action id="Generate" />Platform
IntelliJ <action id="Generate" />IDEA <action id="Generate" />简称 <action id="Generate" />IDEA,是 <action id="Generate" />Jetbrains <action id="Generate" />公司旗下的一款 <action id="Generate" />JAVA <action id="Generate" />开发工具,支持 <action id="Generate" />Java、Scala、Groovy <action id="Generate" />等语言的开发,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和 <action id="Generate" />Web <action id="Generate" />应用的开发,提供了丰富的功能,智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 <action id="Generate" />创新的GUI设计等。
IntelliJ <action id="Generate" />Platform <action id="Generate" />是一个构建 <action id="Generate" />IDE <action id="Generate" />的开源平台,基于它构建的 <action id="Generate" />IDE <action id="Generate" />有 <action id="Generate" />IntelliJ <action id="Generate" />IDEA、WebStorm、DataGrip、以及 <action id="Generate" />Android <action id="Generate" />Studio <action id="Generate" />等等。IDEA <action id="Generate" />插件也是基于 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />开发的。
二、开发环境搭建

注意各软件版本要对应
1、开发工具

IDEA <action id="Generate" />2020.1 <action id="Generate" />各版本下载地址:https://www.jetbrains.com/idea/download/other.html
gradle <action id="Generate" />6.1 <action id="Generate" />各版本下载地址:https://gradle.org/releases/
org.jetbrains.intellij <action id="Generate" />0.4.22
jdk <action id="Generate" />1.8
首先看一下目前idea版本的变动,找到自己当前idea对应的版本需要的jdk版本
https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html?from=jetbrains.org#intellij-platform-based-products-of-recent-ide-versions
接下来需要找idea对应版本的gradle版本
https://www.jetbrains.com/legal/third-party-software/?product=iic&version=2020.1.1
最后就是找 <action id="Generate" />gradle版本对应的 <action id="Generate" />org.jetbrains.intellij <action id="Generate" />插件版本,在gradle-intellij-plugin插件的releases页面,这里会在描述中指出有各个插件版本对应最低的gradle版本。
https://github.com/JetBrains/gradle-intellij-plugin/releases?page=1
添加依赖到gradel配置文件,获取相关依赖配置
https://mvnrepository.com/artifact/org.springframework/spring-web
2、启用Plugin <action id="Generate" />DevKit

Plugin <action id="Generate" />DevKit <action id="Generate" />是 <action id="Generate" />IntelliJ <action id="Generate" />的一个插件,它使用 <action id="Generate" />IntelliJ <action id="Generate" />IDEA <action id="Generate" />自己的构建系统来为开发 <action id="Generate" />IDEA <action id="Generate" />插件提供支持。开发 <action id="Generate" />IDEA <action id="Generate" />插件之前需要安装并启用 <action id="Generate" />Plugin <action id="Generate" />DevKit <action id="Generate" />。
打开 <action id="Generate" />IDEA,导航到 <action id="Generate" />Settings <action id="Generate" />| <action id="Generate" />Plugins,若插件列表中没有 <action id="Generate" />Plugin <action id="Generate" />DevKit,点击 <action id="Generate" />Install <action id="Generate" />JetBrains <action id="Generate" />plugin,搜索并安装。

3、配置IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />SDK

IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />SDK <action id="Generate" />就是开发 <action id="Generate" />IntelliJ <action id="Generate" />平台插件的SDK, <action id="Generate" />是基于 <action id="Generate" />JDK <action id="Generate" />之上运行的,类似于开发 <action id="Generate" />Android <action id="Generate" />应用需要 <action id="Generate" />Android <action id="Generate" />SDK。
3.1导航到 <action id="Generate" />File <action id="Generate" />| <action id="Generate" />Project <action id="Generate" />Structure,选择对话框左侧栏 <action id="Generate" />Platform <action id="Generate" />Settings <action id="Generate" />下的 <action id="Generate" />SDKs
3.2点击 <action id="Generate" />+ <action id="Generate" />按钮,先选择 <action id="Generate" />JDK,指定 <action id="Generate" />JDK <action id="Generate" />的路径;再创建 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />SDK,指定 <action id="Generate" />home <action id="Generate" />path <action id="Generate" />为 <action id="Generate" />IDEA <action id="Generate" />的安装路径,如图

创建好 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />SDK <action id="Generate" />后,选择左侧栏 <action id="Generate" />Project <action id="Generate" />Settings <action id="Generate" />下的 <action id="Generate" />Projects,在 <action id="Generate" />Project <action id="Generate" />SDK <action id="Generate" />下选择刚创建的 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />SDK。

4、设置源码路径(可选)

4.1查看 <action id="Generate" />build <action id="Generate" />号:打开 <action id="Generate" />IDEA,Help <action id="Generate" />| <action id="Generate" />About,查看版本号及 <action id="Generate" />build <action id="Generate" />号
4.2IDEA <action id="Generate" />Community <action id="Generate" />源码(https://github.com/JetBrains/intellij-community/):切换到与 <action id="Generate" />build <action id="Generate" />号相同的分支,点击 <action id="Generate" />Clone <action id="Generate" />or <action id="Generate" />download <action id="Generate" />按钮,选择 <action id="Generate" />Download <action id="Generate" />ZIP

4.3选择工程结构设置后选择SDKs->选中之前在第3步添加的sdk点击SourcePath后按如下1点击添加一个sourcePath,选择上面下载额源码后点击OK、点击Applay

4.4未安装源码时点击某一个action(NewModuleAction)会看到如下所示阅读起来会比较晦涩难懂。

5、Sandbox

IntelliJ <action id="Generate" />IDEA <action id="Generate" />插件以 <action id="Generate" />Debug/Run <action id="Generate" />模式运行时是在 <action id="Generate" />SandBox <action id="Generate" />中进行的,不会影响当前的 <action id="Generate" />IntelliJ <action id="Generate" />IDEA;但是同一台机器同时开发多个插件时默认使用的同一个 <action id="Generate" />sandbox,即在创建 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />SDK <action id="Generate" />时默认指定的 <action id="Generate" />Sandbox <action id="Generate" />Home

如果需要每个插件的开发环境是相互独立的,可以创建多个 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />SDK,为 <action id="Generate" />Sandbox <action id="Generate" />Home <action id="Generate" />指定不同的目录 <action id="Generate" />。
三、开发一个简单插件

插件的创建、配置、运行、打包流程,以及 <action id="Generate" />action
1、创建一个插件工程

选择 <action id="Generate" />File <action id="Generate" />| <action id="Generate" />New <action id="Generate" />| <action id="Generate" />Project,左侧栏中选择 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />Plugin <action id="Generate" />工程类型

点击 <action id="Generate" />Next,设置工程名称及位置,点击 <action id="Generate" />Finish <action id="Generate" />完成创建。可以到 <action id="Generate" />File <action id="Generate" />| <action id="Generate" />Project <action id="Generate" />Structure <action id="Generate" />来自定义工程设置。
除了在idea创建插件项目外,我们还可以下载github模板代码进行修改:https://github.com/JetBrains/intellij-platform-plugin-template
2、插件工程结构

插件工程内容:
  1. PluginDemo/
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />resources/
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />META-INF/
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />plugin.xml
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />src/
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com/foo/...
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
复制代码
3、plugin.xml

下面示例描述了可在 <action id="Generate" />plugin.xml <action id="Generate" />文件配置的主要元素:
  1. <idea-plugin>
  2. <action id="Generate" /> <action id="Generate" />
  3. <action id="Generate" /> <action id="Generate" /><name>MyPlugin</name>
  4. <action id="Generate" /> <action id="Generate" />
  5. <action id="Generate" /> <action id="Generate" /><id>com.example.plugin.myplugin</id>
  6. <action id="Generate" /> <action id="Generate" />
  7. <action id="Generate" /> <action id="Generate" /><description>my <action id="Generate" />plugin <action id="Generate" />description</description>
  8. <action id="Generate" /> <action id="Generate" />
  9. <action id="Generate" /> <action id="Generate" /><change-notes>Initial <action id="Generate" />release <action id="Generate" />of <action id="Generate" />the <action id="Generate" />plugin.</change-notes>
  10. <action id="Generate" /> <action id="Generate" />
  11. <action id="Generate" /> <action id="Generate" /><version>1.0</version>
  12. <action id="Generate" /> <action id="Generate" />
  13. <action id="Generate" /> <action id="Generate" /><vendor <action id="Generate" />url="http://www.jetbrains.com" <action id="Generate" />email="support@jetbrains.com" <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" />
  15. <action id="Generate" /> <action id="Generate" /><depends>MyFirstPlugin</depends>
  16. <action id="Generate" /> <action id="Generate" />
  17. <action id="Generate" /> <action id="Generate" /><idea-version <action id="Generate" />since-build="3000" <action id="Generate" />until-build="3999"/>
  18. <action id="Generate" /> <action id="Generate" />
  19. <action id="Generate" /> <action id="Generate" /><application-components>
  20. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><component>
  21. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
  22. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><interface-class>com.plugin.demo.Component1Interface</interface-class>
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><implementation-class>com.plugin.demo.impl.Component1Impl</implementation-class>
  25. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /></component>
  26. <action id="Generate" /> <action id="Generate" /></application-components>
  27. <action id="Generate" /> <action id="Generate" />
  28. <action id="Generate" /> <action id="Generate" /><project-components>
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><component>
  30. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
  31. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><interface-class>com.plugin.demo.impl.Component2</interface-class>
  32. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /></component>
  33. <action id="Generate" /> <action id="Generate" /></project-components>
  34. <action id="Generate" /> <action id="Generate" />
  35. <action id="Generate" /> <action id="Generate" /><module-components>
  36. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><component>
  37. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><interface-class>com.plugin.demo.impl.Component3</interface-class>
  38. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /></component>
  39. <action id="Generate" /> <action id="Generate" /></module-components>
  40. <action id="Generate" /> <action id="Generate" />
  41. <action id="Generate" /> <action id="Generate" /><actions>
  42. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  43. <action id="Generate" /> <action id="Generate" /></actions>
  44. <action id="Generate" /> <action id="Generate" />
  45. <action id="Generate" /> <action id="Generate" /><extensionPoints>
  46. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  47. <action id="Generate" /> <action id="Generate" /></extensionPoints>
  48. <action id="Generate" /> <action id="Generate" />
  49. <action id="Generate" /> <action id="Generate" /><extensions <action id="Generate" />xmlns="com.intellij">
  50. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  51. <action id="Generate" /> <action id="Generate" /></extensions>
  52. </idea-plugin>
复制代码
4、创建 <action id="Generate" />Action

Action是实现插件功能的类, <action id="Generate" />一个Action类需要继承AnAction并且实现actionPerformed方法。当用户点击菜单或者工具栏按钮, <action id="Generate" />按快捷键,或者通过Help <action id="Generate" />| <action id="Generate" />Find <action id="Generate" />Action点击时, <action id="Generate" />IntelliJ <action id="Generate" />Platform系统会回调对应Action的actionPerformed方法。
一个 <action id="Generate" />Action <action id="Generate" />表示 <action id="Generate" />IDEA <action id="Generate" />菜单里的一个 <action id="Generate" />menu <action id="Generate" />item <action id="Generate" />或工具栏上的一个按钮,通过继承 <action id="Generate" />AnAction <action id="Generate" />class <action id="Generate" />实现,当选择一个 <action id="Generate" />menu <action id="Generate" />item <action id="Generate" />或点击工具栏上的按钮时,就会调用 <action id="Generate" />AnAction <action id="Generate" />类的 <action id="Generate" />actionPerformed <action id="Generate" />方法。
实现自定义 <action id="Generate" />Action <action id="Generate" />分两步:
4.1、定义 <action id="Generate" />Action

定义一个 <action id="Generate" />Java <action id="Generate" />class,继承 <action id="Generate" />AnAction <action id="Generate" />类,并重写 <action id="Generate" />actionPerformed <action id="Generate" />方法, <action id="Generate" />如
  1. public <action id="Generate" />class <action id="Generate" />ActionDemo <action id="Generate" />extends <action id="Generate" />AnAction <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />actionPerformed(AnActionEvent <action id="Generate" />event) <action id="Generate" />{
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Project <action id="Generate" />project <action id="Generate" />= <action id="Generate" />event.getData(PlatformDataKeys.PROJECT);
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Messages.showInputDialog(
  5. <extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  8. <action id="Generate" /> <action id="Generate" /></extensions>project,
  9. <extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  10. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  12. <action id="Generate" /> <action id="Generate" /></extensions>"What <action id="Generate" />is <action id="Generate" />your <action id="Generate" />name?",
  13. <extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  15. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  16. <action id="Generate" /> <action id="Generate" /></extensions>"Input <action id="Generate" />your <action id="Generate" />name",
  17. <extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  20. <action id="Generate" /> <action id="Generate" /></extensions>Messages.getQuestionIcon());
  21. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  22. }
复制代码
4.2、注册 <action id="Generate" />Action

在 <action id="Generate" />plugin.xml <action id="Generate" />文件的元素内注册
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions>
复制代码
上面示例会定义一个被添加到 <action id="Generate" />IDEA <action id="Generate" />主菜单的最后面的 <action id="Generate" />“SampleMenu” <action id="Generate" />的菜单,点击该菜单将弹出一个 <action id="Generate" />“Text <action id="Generate" />Boxes” <action id="Generate" />item,如图

4.3、快速创建 <action id="Generate" />Action

IntelliJ <action id="Generate" />Platform <action id="Generate" />提供了 <action id="Generate" />New <action id="Generate" />Action <action id="Generate" />向导,它会帮助我们创建 <action id="Generate" />action <action id="Generate" />class <action id="Generate" />并配置 <action id="Generate" />plugin.xml <action id="Generate" />文件:
在目标 <action id="Generate" />package <action id="Generate" />上右键,选择 <action id="Generate" />New <action id="Generate" />| <action id="Generate" />Plugin <action id="Generate" />DevKit <action id="Generate" />| <action id="Generate" />Action:


注意:该向导只能向主菜单中已存在的 <action id="Generate" />action <action id="Generate" />group <action id="Generate" />或工具栏上添加 <action id="Generate" />action,若要创建新的 <action id="Generate" />action <action id="Generate" />group,请参考前面的内容。
5、运行调试插件

运行/调试插件可直接在 <action id="Generate" />IntelliJ <action id="Generate" />IDEA <action id="Generate" />进行,选择 <action id="Generate" />Run <action id="Generate" />| <action id="Generate" />Edit <action id="Generate" />Configurations...,若左侧栏没有 <action id="Generate" />Plugin <action id="Generate" />类型的 <action id="Generate" />Configuration, <action id="Generate" />点击右上角 <action id="Generate" />+ <action id="Generate" />按钮,选择 <action id="Generate" />Plugin <action id="Generate" />类型, <action id="Generate" />如图

Use <action id="Generate" />classpath <action id="Generate" />of <action id="Generate" />module <action id="Generate" />选择要调试的 <action id="Generate" />module,其余配置一般默认即可;切换到 <action id="Generate" />Logs <action id="Generate" />选项卡,如果勾选了 <action id="Generate" />idea.log,运行插件时 <action id="Generate" />idea.log <action id="Generate" />文件的内容将输出到 <action id="Generate" />idea.log <action id="Generate" />console。
运行插件点击工具栏上运行按钮Run


6、打包安装插件

6.1、打包插件

选择 <action id="Generate" />Build <action id="Generate" />| <action id="Generate" />Prepare <action id="Generate" />Plugin <action id="Generate" />Module <action id="Generate" />‘module <action id="Generate" />name’ <action id="Generate" />for <action id="Generate" />Deployment <action id="Generate" />来打包插件:

jar类型的插件包:
  1. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />PluginDemo.jar/
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com/xxx/...
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />META-INF/
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />plugin.xml
复制代码
zip类型的插件包:
  1. PluginDemo.zip/ <action id="Generate" /> <action id="Generate" />lib/ <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />libxxx.jar <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />libbar.jar <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />PluginDemo.jar/
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com/xxx/...
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />META-INF/
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />plugin.xml
复制代码
6.2、安装插件

导航到 <action id="Generate" />File <action id="Generate" />| <action id="Generate" />Settings <action id="Generate" />| <action id="Generate" />Plugins <action id="Generate" />页面,点击 <action id="Generate" />Install <action id="Generate" />plugin <action id="Generate" />from <action id="Generate" />disk...

四、Action允许添加的位置

这个时候我们了解的都比较浅显还停留在demo层面,如何进行深入的了解呢?
eg:我们怎么知道都有哪些 <action id="Generate" />action <action id="Generate" />或 <action id="Generate" />action <action id="Generate" />group <action id="Generate" />可以被我们添加呢?
1.添加主菜单MainMenu

1、我们可以点击配置group-id="MainMenu"下的MainMenu
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions>
复制代码
2、进入PlatformActions.xml如下图,这个时候不难看出这里就是主菜单的第一列子菜单

3.这个时候如果我们想新建个类似与File-->New和Open的菜单该怎么做呢?
3.1我们应该先实现布局,添加主菜单MainMenu
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><actions>
  12. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  15. <action id="Generate" /> <action id="Generate" /></group>
  16. </actions><actions>
  17. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  20. <action id="Generate" /> <action id="Generate" /></group>
  21. </actions><actions>
  22. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  25. <action id="Generate" /> <action id="Generate" /></group>
  26. </actions><actions>
  27. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  30. <action id="Generate" /> <action id="Generate" /></group>
  31. </actions><actions>
  32. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  33. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  34. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  35. <action id="Generate" /> <action id="Generate" /></group>
  36. </actions><actions>
  37. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  38. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  39. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  40. <action id="Generate" /> <action id="Generate" /></group>
  41. </actions><actions>
  42. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  43. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  44. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  45. <action id="Generate" /> <action id="Generate" /></group>
  46. </actions><actions>
  47. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  48. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  49. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  50. <action id="Generate" /> <action id="Generate" /></group>
  51. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  52. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  53. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  54. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" />
复制代码
3.2实现自定义的打开文件
其实是通过下面的action配置的OpenFileAction找到源码
  1. [/code]在将源码拷贝出来粘贴到自己的action内。这样就可以实现自己的主菜单File下的Open子菜单
  2. 3.3这个时候有人会有疑问我不知道去哪找New对应的action呀?
  3. 这个时候我们通过界面可以看到Project <action id="Generate" />from <action id="Generate" />Existing <action id="Generate" />Sources...,这里我们就可以去搜这个文本呀。既然显示在页面上。必然有地方定义了它。 <action id="Generate" />ActionBundle.properties
  4. [img]https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9ccb4c8b67ec4864adb3477dc441524a~tplv-k3u1fbpfcp-zoom-1.image[/img]
  5. 这个时候我们在根据对应的action定义的文本在去搜索对应的action,com.intellij.ide.actions.ImportProjectAction
  6. [img]https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab2a3a89488b48b5a210587933b919e3~tplv-k3u1fbpfcp-zoom-1.image[/img]
  7. 3.4这个时候我们将对应的action拷贝到自己的插件定义的配置上也就形成了3.1的一级和二级菜单
  8. [img]https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3940891b6c624369b700236efbf353d0~tplv-k3u1fbpfcp-zoom-1.image[/img]
  9. [size=4]2.添加主工具栏MainToolBar[/size]
  10. 添加主工具栏MainToolBar(如果不清楚哪里是主菜单、主工具栏、导航栏、上下文菜单、弹出菜单参考[url=https://www.w3cschool.cn/intellij%5C%5C_idea%5C%5C_doc/intellij%5C%5C_idea%5C%5C_doc-34852d55.html]https://www.w3cschool.cn/intellij\\_idea\\_doc/intellij\\_idea\\_doc-34852d55.html[/url])
  11. [code]<actions>
  12. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  15. <action id="Generate" /> <action id="Generate" /></group>
  16. </actions><actions>
  17. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  20. <action id="Generate" /> <action id="Generate" /></group>
  21. </actions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码

3、添加上下文菜单ProjectViewPopupMenu
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码

4、添加弹出菜单EditorPopupMenu
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  14. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" />
复制代码

5、添加打印ConsoleEditorPopupMenu
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  14. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码

6、右键新建action时也可以直接选择添加的位置。

1.筛选后查找要添加的group
2.选择对应的action
3.选择要添加到这个action的某个位置

五、Components(已不建议使用)

IntelliJ <action id="Generate" />IDEA <action id="Generate" />的组件模型是基于 <action id="Generate" />PicoContainer <action id="Generate" />的,组件都包含在这些容器中,但容器有三种级别:application <action id="Generate" />container,project <action id="Generate" />container <action id="Generate" />以及 <action id="Generate" />module <action id="Generate" />container。application <action id="Generate" />container <action id="Generate" />可以包含多个 <action id="Generate" />project <action id="Generate" />container,而 <action id="Generate" />project <action id="Generate" />container <action id="Generate" />可以包含多个 <action id="Generate" />module <action id="Generate" />container。
1、Components <action id="Generate" />类型

Components <action id="Generate" />是插件开发的基础,Components <action id="Generate" />有三种类型:

2、注册 <action id="Generate" />Components

components <action id="Generate" />需要配置在 <action id="Generate" />plugin.xml <action id="Generate" />中,并指定 <action id="Generate" />interface <action id="Generate" />和 <action id="Generate" />implementation,interface <action id="Generate" />类用于从其他组件中检索组件,implementation <action id="Generate" />类用于实例化组件。示例:
  1. //创建一个 <action id="Generate" />application <action id="Generate" />level <action id="Generate" />component
  2. public <action id="Generate" />interface <action id="Generate" />Component1 <action id="Generate" />extends <action id="Generate" />ApplicationComponent <action id="Generate" />{
  3. }
  4. public <action id="Generate" />class <action id="Generate" />Component1Impl <action id="Generate" />implements <action id="Generate" />Component1 <action id="Generate" />{
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />getComponentName() <action id="Generate" />{
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />"PluginDemo.Component1";
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  9. }
复制代码
plugin.xml
  1. <application-components>
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><component>
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><interface-class>com.example.test.Component1</interface-class>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><implementation-class>com.example.test.Component1Impl</implementation-class>
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /></component>
  6. <action id="Generate" /></application-components>
复制代码
注意:一个 <action id="Generate" />interface-class <action id="Generate" />不能有多个 <action id="Generate" />implementation-class,如下图:

3、Component <action id="Generate" />周期方法

ApplicationComponent <action id="Generate" />的生命周期方法:
  1. //构造方法
  2. public <action id="Generate" />constructor(){
  3. }
  4. //初始化
  5. public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  6. }
  7. public <action id="Generate" />void <action id="Generate" />disposeComponent() <action id="Generate" />{
  8. }
复制代码
ProjectComponent <action id="Generate" />的生命周期方法:
  1. //构造方法
  2. public <action id="Generate" />constructor(){
  3. }
  4. //通知一个project已经完成加载
  5. public <action id="Generate" />void <action id="Generate" />projectOpened() <action id="Generate" />{
  6. }
  7. public <action id="Generate" />void <action id="Generate" />projectClosed() <action id="Generate" />{
  8. }
  9. //执行初始化操作以及与其他 <action id="Generate" />components <action id="Generate" />的通信
  10. public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  11. }
  12. //释放系统资源或执行其他清理
  13. public <action id="Generate" />void <action id="Generate" />disposeComponent() <action id="Generate" />{
  14. }
复制代码
ModuleComponent <action id="Generate" />的生命周期方法:
ModuleComponent <action id="Generate" />的生命周期方法中比 <action id="Generate" />ProjectComponent <action id="Generate" />多一个 <action id="Generate" />moduleAdded(),用于通知 <action id="Generate" />module <action id="Generate" />已经被添加到 <action id="Generate" />project <action id="Generate" />中。
4、Component <action id="Generate" />加载

Application <action id="Generate" />级别的 <action id="Generate" />components <action id="Generate" />在 <action id="Generate" />IDEA <action id="Generate" />启动时加载,Project <action id="Generate" />和 <action id="Generate" />Module <action id="Generate" />级别的 <action id="Generate" />components <action id="Generate" />在项目启动时共同加载。
一个组件加载过程:
如果 <action id="Generate" />component <action id="Generate" />在加载时需要用到其他 <action id="Generate" />component,我们只需在该 <action id="Generate" />component <action id="Generate" />的构造方法的参数列表声明即可,在这种情况下,IntelliJ <action id="Generate" />IDEA <action id="Generate" />会按正确的顺序实例化所依赖的 <action id="Generate" />component。
示例:
  1. public <action id="Generate" />class <action id="Generate" />MyComponent <action id="Generate" />implements <action id="Generate" />ApplicationComponent <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />private <action id="Generate" />final <action id="Generate" />MyOtherComponent <action id="Generate" />otherComponent;
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />MyComponent(MyOtherComponent <action id="Generate" />otherComponent) <action id="Generate" />{
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />this.otherComponent <action id="Generate" />= <action id="Generate" />otherComponent;
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  7. }
复制代码
5、Component <action id="Generate" />卸载

一个组件卸载过程:
6、Component <action id="Generate" />容器

前面我们提到有三种不同的容器,application <action id="Generate" />container <action id="Generate" />实现 <action id="Generate" />Application <action id="Generate" />接口; <action id="Generate" />project <action id="Generate" />container <action id="Generate" />实现 <action id="Generate" />Project <action id="Generate" />接口;
module <action id="Generate" />container <action id="Generate" />实现 <action id="Generate" />Module <action id="Generate" />接口。每一个容器都有自己的方法去获取容器内的 <action id="Generate" />component。
获取 <action id="Generate" />application <action id="Generate" />容器及其内部的组件:
  1. /获取application容器
  2. Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  3. //获取application容器中的组件
  4. MyComponent <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(MyComponent.class);
复制代码
获取 <action id="Generate" />project <action id="Generate" />/ <action id="Generate" />module <action id="Generate" />容器及其内部的组件:
在 <action id="Generate" />component <action id="Generate" />构造方法的参数列表中声明:
  1. public <action id="Generate" />class <action id="Generate" />MyComponent <action id="Generate" />implements <action id="Generate" />ProjectComponent <action id="Generate" />{
  2. Project <action id="Generate" />project;
  3. public <action id="Generate" />MyComponent(Project <action id="Generate" />project){
  4. this.project <action id="Generate" />= <action id="Generate" />project;
  5. }
  6. public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  7. OtherComponent <action id="Generate" />otherComponent <action id="Generate" />= <action id="Generate" />project.getComponent(OtherComponent.class);
  8. }
  9. }
复制代码
在这个例子中,组件在构造方法中获取了容器对象,将其保存,然后在 <action id="Generate" />component <action id="Generate" />其他地方进行引用。
7、 <action id="Generate" />各组件使用时机

7.1创建一个ApplicationComponent
  1. package <action id="Generate" />com.plugin.demo.component;
  2. import <action id="Generate" />com.intellij.openapi.components.ApplicationComponent;
  3. //创建一个 <action id="Generate" />application <action id="Generate" />level <action id="Generate" />component
  4. public <action id="Generate" />interface <action id="Generate" />ApplicationComponentDemo <action id="Generate" />extends <action id="Generate" />ApplicationComponent <action id="Generate" />{
  5. }
  6. package <action id="Generate" />com.plugin.demo.component;
  7. import <action id="Generate" />com.intellij.openapi.application.Application;
  8. import <action id="Generate" />com.intellij.openapi.application.ApplicationManager;
  9. public <action id="Generate" />class <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />implements <action id="Generate" />ApplicationComponentDemo <action id="Generate" />{
  10. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />getComponentName() <action id="Generate" />{
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ApplicationComponentDemoImpl <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+this.getClass().getName());
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />this.getClass().getName();
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  15. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//初始化
  16. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  17. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ApplicationComponentDemoImpl <action id="Generate" />initComponent" <action id="Generate" />);
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />disposeComponent() <action id="Generate" />{
  20. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器
  21. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  22. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器中的组件
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemoImpl.class);
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("disposeComponent <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />myComponent.getComponentName());
  25. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  26. }
复制代码
7.2 <action id="Generate" />创建一个ProjectComponent
  1. package <action id="Generate" />com.plugin.demo.component;
  2. import <action id="Generate" />com.intellij.openapi.application.Application;
  3. import <action id="Generate" />com.intellij.openapi.application.ApplicationManager;
  4. import <action id="Generate" />com.intellij.openapi.components.ProjectComponent;
  5. import <action id="Generate" />org.jetbrains.annotations.NotNull;
  6. public <action id="Generate" />class <action id="Generate" />ProjectComponentDemo <action id="Generate" />implements <action id="Generate" />ProjectComponent <action id="Generate" />{
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@NotNull
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />getComponentName() <action id="Generate" />{
  10. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器中的组件
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemoImpl.class);
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ProjectComponentDemo <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />myComponent.getComponentName());
  15. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />myComponent.getComponentName();
  16. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  17. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  19. // <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />获取application容器
  20. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  21. // <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />获取application容器中的组件
  22. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemo <action id="Generate" />component <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemo.class);
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ApplicationComponentDemoImpl <action id="Generate" />initComponent <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />component.getComponentName());
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ProjectComponentDemo <action id="Generate" />initComponent");
  25. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  26. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  27. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />disposeComponent() <action id="Generate" />{
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  30. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器中的组件
  31. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemoImpl.class);
  32. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("disposeComponent <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />myComponent.getComponentName());
  33. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  34. }
复制代码
7.3创建一个ModuleComponent
  1. package <action id="Generate" />com.plugin.demo.component;
  2. import <action id="Generate" />com.intellij.openapi.application.Application;
  3. import <action id="Generate" />com.intellij.openapi.application.ApplicationManager;
  4. import <action id="Generate" />com.intellij.openapi.components.ApplicationComponent;
  5. import <action id="Generate" />com.intellij.openapi.module.ModuleComponent;
  6. import <action id="Generate" />com.intellij.openapi.project.Project;
  7. import <action id="Generate" />com.intellij.openapi.project.ProjectManager;
  8. import <action id="Generate" />org.jetbrains.annotations.NotNull;
  9. public <action id="Generate" />class <action id="Generate" />ModuleComponentDemo <action id="Generate" />implements <action id="Generate" />ModuleComponent <action id="Generate" />{
  10. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@NotNull
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />getComponentName() <action id="Generate" />{
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  15. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器中的组件
  16. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemoImpl.class);
  17. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ApplicationComponentDemoImpl <action id="Generate" />initComponent <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />myComponent.getComponentName());
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ProjectManager <action id="Generate" />projectManager <action id="Generate" />= <action id="Generate" />ProjectManager.getInstance();
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Project <action id="Generate" />defaultProject <action id="Generate" />= <action id="Generate" />projectManager.getDefaultProject();
  20. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ProjectComponentDemo <action id="Generate" />component <action id="Generate" />= <action id="Generate" />defaultProject.getComponent(ProjectComponentDemo.class);
  21. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ProjectComponentDemo <action id="Generate" />initComponent" <action id="Generate" />+ <action id="Generate" />component.getComponentName());
  22. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />myComponent.getComponentName();
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  25. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />initComponent() <action id="Generate" />{
  26. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ModuleComponentDemo <action id="Generate" />initComponent");
  27. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />@Override
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />disposeComponent() <action id="Generate" />{
  30. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器
  31. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />Application <action id="Generate" />application <action id="Generate" />= <action id="Generate" />ApplicationManager.getApplication();
  32. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />//获取application容器中的组件
  33. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />ApplicationComponentDemoImpl <action id="Generate" />myComponent <action id="Generate" />= <action id="Generate" />application.getComponent(ApplicationComponentDemoImpl.class);
  34. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("disposeComponent <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />myComponent.getComponentName());
  35. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  36. }
复制代码
7.4注册配置Component
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  9. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com.plugin.demo.component.ApplicationComponentDemo<actions>
  10. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  13. <action id="Generate" /> <action id="Generate" /></group>
  14. </actions>com.plugin.demo.component.ApplicationComponentDemoImpl<actions>
  15. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  16. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  17. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  18. <action id="Generate" /> <action id="Generate" /></group>
  19. </actions><actions>
  20. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  21. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  22. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  23. <action id="Generate" /> <action id="Generate" /></group>
  24. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  25. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  26. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  27. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com.plugin.demo.component.ProjectComponentDemo<actions>
  28. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  30. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  31. <action id="Generate" /> <action id="Generate" /></group>
  32. </actions>com.plugin.demo.component.ProjectComponentDemo<actions>
  33. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  34. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  35. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  36. <action id="Generate" /> <action id="Generate" /></group>
  37. </actions><actions>
  38. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  39. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  40. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  41. <action id="Generate" /> <action id="Generate" /></group>
  42. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  43. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  44. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  45. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />com.plugin.demo.component.ModuleComponentDemo<actions>
  46. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  47. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  48. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  49. <action id="Generate" /> <action id="Generate" /></group>
  50. </actions>com.plugin.demo.component.ModuleComponentDemo<actions>
  51. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  52. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  53. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  54. <action id="Generate" /> <action id="Generate" /></group>
  55. </actions> <action id="Generate" />
复制代码
7.5运行后的预期是先执行应用层组件,在执行工程级组件,在执行模块级组件

六、Extensions <action id="Generate" />and <action id="Generate" />Extension <action id="Generate" />Points

如果插件需要扩展 <action id="Generate" />IDEA <action id="Generate" />Platform <action id="Generate" />或 <action id="Generate" />其他插件的功能,或为其他插件提供可以扩展自己的接口,那么就要用到 <action id="Generate" />extensions <action id="Generate" />和 <action id="Generate" />extension <action id="Generate" />points,用于与 <action id="Generate" />IDEA <action id="Generate" />和其他插件交互。
1、Extension <action id="Generate" />points <action id="Generate" />扩展点

extension <action id="Generate" />point <action id="Generate" />用于数据信息扩展,使其他插件可以扩展本插件的功能,可通过plugin.xml <action id="Generate" />的 <action id="Generate" />元素声明,如下示例:
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  9. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码
示例上述代码中的 <action id="Generate" />MyExtensionPoint1 <action id="Generate" />的 <action id="Generate" />beanClass:
  1. public <action id="Generate" />class <action id="Generate" />MyBeanClass <action id="Generate" />extends <action id="Generate" />AbstractExtensionPointBean <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" />@Attribute("key")
  3. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />key;
  4. <action id="Generate" /> <action id="Generate" />@Attribute("implementationClass")
  5. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />implementationClass;
  6. <action id="Generate" /> <action id="Generate" />...
  7. }
复制代码
2、Extension <action id="Generate" />扩展其他插件功能

如果插件需要扩展 <action id="Generate" />IntelliJ <action id="Generate" />Platform <action id="Generate" />或其他插件的功能,需要声明一个或多个 <action id="Generate" />extension。

示例:
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码
插件的 <action id="Generate" />service <action id="Generate" />的实现就是扩展 <action id="Generate" />IDEA <action id="Generate" />Platform <action id="Generate" />的 <action id="Generate" />applicationService <action id="Generate" />或 <action id="Generate" />projectService <action id="Generate" />两个 <action id="Generate" />extension <action id="Generate" />points
3、获取 <action id="Generate" />extension <action id="Generate" />points

IntelliJ <action id="Generate" />Platform <action id="Generate" />的部分 <action id="Generate" />extension <action id="Generate" />points
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><actions>
  12. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  15. <action id="Generate" /> <action id="Generate" /></group>
  16. </actions><actions>
  17. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  20. <action id="Generate" /> <action id="Generate" /></group>
  21. </actions><actions>
  22. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  25. <action id="Generate" /> <action id="Generate" /></group>
  26. </actions><actions>
  27. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  30. <action id="Generate" /> <action id="Generate" /></group>
  31. </actions><actions>
  32. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  33. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  34. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  35. <action id="Generate" /> <action id="Generate" /></group>
  36. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  37. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  38. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  39. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码
其他可以从被扩展插件的 <action id="Generate" />plugin.xml <action id="Generate" />文件中获取
https://plugins.jetbrains.com/intellij-platform-explorer/extensions
七、Service

参考:https://plugins.jetbrains.com/docs/intellij/plugin-services.html#examples
Service <action id="Generate" />也是一种按需加载的 <action id="Generate" />component,在调用 <action id="Generate" />ServiceManager.getService(Class)时才会加载,且程序中只有一个实例。
Service是插件的一个组件, <action id="Generate" />是为了把公共的逻辑放到一起,Service的实例是单例的。
Serivce <action id="Generate" />在 <action id="Generate" />IntelliJ <action id="Generate" />IDEA <action id="Generate" />中是以 <action id="Generate" />extension <action id="Generate" />point <action id="Generate" />形式提供的,实现自己的 <action id="Generate" />service <action id="Generate" />需要扩展相应 <action id="Generate" />extension <action id="Generate" />point。
声明 <action id="Generate" />service <action id="Generate" />时必须包含 <action id="Generate" />serviceImplementation <action id="Generate" />属性用于实例化 <action id="Generate" />service, <action id="Generate" />serviceInterface <action id="Generate" />属性是可选的,可用于获取 <action id="Generate" />service <action id="Generate" />实例。
1、创建 <action id="Generate" />Service

在需要放置 <action id="Generate" />service <action id="Generate" />的 <action id="Generate" />package <action id="Generate" />上右键, <action id="Generate" />New <action id="Generate" />| <action id="Generate" />Plugin <action id="Generate" />DevKit <action id="Generate" />| <action id="Generate" />xxxxService,如图

选择相应 <action id="Generate" />service,弹出如下对话框,填写 <action id="Generate" />interface <action id="Generate" />类和 <action id="Generate" />implementation <action id="Generate" />类,若不勾选 <action id="Generate" />Separate <action id="Generate" />interface <action id="Generate" />from <action id="Generate" />implementation,只需填写 <action id="Generate" />implementation <action id="Generate" />类。

IntelliJ <action id="Generate" />IDEA <action id="Generate" />会自动创建相应类并配置 <action id="Generate" />plugin.xml <action id="Generate" />文件。
示例:plugin.xml:
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  9. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码
生成的 <action id="Generate" />service <action id="Generate" />类:
  1. public <action id="Generate" />interface <action id="Generate" />ApplicationServiceDemo <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />static <action id="Generate" />ApplicationServiceDemo <action id="Generate" />getInstance() <action id="Generate" />{
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />ServiceManager.getService(ApplicationServiceDemo.class);
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  5. }
  6. public <action id="Generate" />interface <action id="Generate" />ProjectServiceDemo <action id="Generate" />{
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />static <action id="Generate" />ProjectServiceDemo <action id="Generate" />getInstance(@NotNull <action id="Generate" />Project <action id="Generate" />project) <action id="Generate" />{
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />ServiceManager.getService(project, <action id="Generate" />ProjectServiceDemo.class);
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  10. }
  11. public <action id="Generate" />interface <action id="Generate" />ModuleServiceDemo <action id="Generate" />{
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />static <action id="Generate" />ModuleServiceDemo <action id="Generate" />getInstance(@NotNull <action id="Generate" />Module <action id="Generate" />module) <action id="Generate" />{
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />module.getService(ModuleServiceDemo.class);
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  15. }
复制代码
  1. public <action id="Generate" />class <action id="Generate" />ApplicationServiceDemoImpl <action id="Generate" />implements <action id="Generate" />ApplicationServiceDemo <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />ApplicationServiceDemoImpl() <action id="Generate" />{
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ApplicationServiceDemoImpl <action id="Generate" />= <action id="Generate" />");
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  5. }
  6. public <action id="Generate" />class <action id="Generate" />ProjectServiceDemoImpl <action id="Generate" />implements <action id="Generate" />ProjectServiceDemo <action id="Generate" />{
  7. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />ProjectServiceDemoImpl(Project <action id="Generate" />project) <action id="Generate" />{
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ProjectServiceDemoImpl <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />project);
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  10. }
  11. public <action id="Generate" />class <action id="Generate" />ModuleServiceDemoImpl <action id="Generate" />implements <action id="Generate" />ModuleServiceDemo <action id="Generate" />{
  12. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />ModuleServiceDemoImpl(Module <action id="Generate" />project) <action id="Generate" />{
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />System.out.println("ModuleServiceDemoImpl <action id="Generate" />= <action id="Generate" />" <action id="Generate" />+ <action id="Generate" />project);
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />}
  15. }
复制代码
2、获取 <action id="Generate" />Service
  1. MyApplicationService <action id="Generate" />applicationService <action id="Generate" />= <action id="Generate" />ServiceManager.getService(MyApplicationService.class);
  2. //获取 <action id="Generate" />project <action id="Generate" />级别的 <action id="Generate" />service,需要提供 <action id="Generate" />project <action id="Generate" />对象
  3. MyProjectService <action id="Generate" />projectService <action id="Generate" />= <action id="Generate" />ServiceManager.getService(project, <action id="Generate" />MyProjectService.class);
  4. //获取 <action id="Generate" />module <action id="Generate" />级别的 <action id="Generate" />service,需要提供 <action id="Generate" />module <action id="Generate" />对象
  5. MyModuleService <action id="Generate" />moduleService <action id="Generate" />= <action id="Generate" />ModuleServiceManager.getService(module, <action id="Generate" />MyModuleService.class);
复制代码
八、持久化状态

我们在使用 <action id="Generate" />IDE <action id="Generate" />开始开发工作之前,总是要先在 <action id="Generate" />settings <action id="Generate" />页面进行一些设置,且每次重新打开 <action id="Generate" />IDE <action id="Generate" />后这些设置仍然保留着,那么这些设置是如何保存下来的呢?
IntelliJ <action id="Generate" />Platform <action id="Generate" />提供了一些 <action id="Generate" />API,可以使 <action id="Generate" />components <action id="Generate" />或 <action id="Generate" />services <action id="Generate" />在每次打开 <action id="Generate" />IDE <action id="Generate" />时仍然使用之前的数据,即持久化其状态。
1、PropertiesComponent

对于一些简单少量的值,我们可以使用 <action id="Generate" />PropertiesComponent,它可以保存 <action id="Generate" />application <action id="Generate" />级别和 <action id="Generate" />project <action id="Generate" />级别的值。
下面方法用于获取 <action id="Generate" />PropertiesComponent <action id="Generate" />对象:
  1. //获取 <action id="Generate" />application <action id="Generate" />级别的 <action id="Generate" />PropertiesComponent
  2. PropertiesComponent.getInstance()
  3. //获取 <action id="Generate" />project <action id="Generate" />级别的 <action id="Generate" />PropertiesComponent,指定相应的 <action id="Generate" />project
  4. PropertiesComponent.getInstance(Project)
  5. propertiesComponent.setValue(name, <action id="Generate" />value)
  6. propertiesComponent.getValue(name)
复制代码
PropertiesComponent <action id="Generate" />保存的是键值对,由于所有插件使用的是同一个 <action id="Generate" />namespace,强烈建议使用前缀来命名 <action id="Generate" />name,比如使用 <action id="Generate" />plugin <action id="Generate" />id。
2、PersistentStateComponent

PersistentStateComponent <action id="Generate" />用于持久化比较复杂的 <action id="Generate" />components <action id="Generate" />或 <action id="Generate" />services,可以指定需要持久化的值、值的格式以及存储位置。
要使用 <action id="Generate" />PersistentStateComponent <action id="Generate" />持久化状态:
下面通过两个例子进行说明:
  1. class <action id="Generate" />MyService <action id="Generate" />implements <action id="Generate" />PersistentStateComponent<MyService.State> <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" />//这里 <action id="Generate" />state <action id="Generate" />是一个 <action id="Generate" />bean <action id="Generate" />class
  3. <action id="Generate" /> <action id="Generate" />static <action id="Generate" />class <action id="Generate" />State <action id="Generate" />{
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />value;
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />...
  6. <action id="Generate" /> <action id="Generate" />}
  7. <action id="Generate" /> <action id="Generate" />//用于保存当前的状态
  8. <action id="Generate" /> <action id="Generate" />State <action id="Generate" />myState;
  9. <action id="Generate" /> <action id="Generate" />// <action id="Generate" />从当前对象里获取状态
  10. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />State <action id="Generate" />getState() <action id="Generate" />{
  11. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />myState;
  12. <action id="Generate" /> <action id="Generate" />}
  13. <action id="Generate" /> <action id="Generate" />// <action id="Generate" />从外部加载状态,设置给当前对象的相应字段
  14. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />loadState(State <action id="Generate" />state) <action id="Generate" />{
  15. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />myState <action id="Generate" />= <action id="Generate" />state;
  16. <action id="Generate" /> <action id="Generate" />}
  17. }
复制代码
  1. // <action id="Generate" />这里的 <action id="Generate" />state <action id="Generate" />就是实现类本身
  2. class <action id="Generate" />MyService <action id="Generate" />implements <action id="Generate" />PersistentStateComponent<MyService> <action id="Generate" />{
  3. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />String <action id="Generate" />stateValue;
  4. <action id="Generate" /> <action id="Generate" />...
  5. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />MyService <action id="Generate" />getState() <action id="Generate" />{
  6. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />this;
  7. <action id="Generate" /> <action id="Generate" />}
  8. <action id="Generate" /> <action id="Generate" />public <action id="Generate" />void <action id="Generate" />loadState(MyService <action id="Generate" />state) <action id="Generate" />{
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />XmlSerializerUtil.copyBean(state, <action id="Generate" />this);
  10. <action id="Generate" /> <action id="Generate" />}
  11. }
复制代码
2.1、实现 <action id="Generate" />State <action id="Generate" />类

a、字段要求
state <action id="Generate" />类中可能有多个字段,但不是所有字段都可以被持久化,可以被持久化的字段:
这些字段也有类型要求:
如果不希望某个字段被持久化,可以使用 <action id="Generate" />@com.intellij.util.xmlb.annotations.Transient <action id="Generate" />注解。
b、构造器要求
state <action id="Generate" />类必须有一个默认构造器,这个构造器返回的 <action id="Generate" />state <action id="Generate" />对象被认为是默认状态,只有当当前状态与默认状态不同时,状态才会被持久化。
2.2、定义存储位置

我们可以使用 <action id="Generate" />@State <action id="Generate" />注解来定义存储位置
  1. @State(name <action id="Generate" />= <action id="Generate" />"PersistentDemo", <action id="Generate" />storages <action id="Generate" />= <action id="Generate" />{@Storage(value <action id="Generate" />= <action id="Generate" />"PluginDemo.xml")})
  2. public <action id="Generate" />class <action id="Generate" />PersistentDemo <action id="Generate" />implements <action id="Generate" />PersistentStateComponent<PersistentDemo> <action id="Generate" />{
  3. <action id="Generate" /> <action id="Generate" />...
  4. }
复制代码
name: <action id="Generate" />定义 <action id="Generate" />xml <action id="Generate" />文件根标签的名称
storages: <action id="Generate" />一个或多个 <action id="Generate" />@Storage,定义存储的位置
2.3、生命周期

2.4、组件声明

持久化组件可以声明为 <action id="Generate" />component,也可以声明为 <action id="Generate" />service
声明为 <action id="Generate" />service,plugin.xml <action id="Generate" />文件如下配置:
  1. <extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  4. <action id="Generate" /> <action id="Generate" /></extensions>
复制代码
代码中获取状态与获取 <action id="Generate" />service <action id="Generate" />的方式一样:
  1. PersistentDemo <action id="Generate" />persistDemo <action id="Generate" />= <action id="Generate" />ServiceManager.getService(PersistentDemo.class);
  2. PersistentDemo2 <action id="Generate" />persistDemo2 <action id="Generate" />= <action id="Generate" />ServiceManager.getService(project,PersistentDemo.class);
复制代码
声明为 <action id="Generate" />component,plugin.xml <action id="Generate" />文件如下配置:
  1. <application-components>
  2. <action id="Generate" /> <action id="Generate" />
  3. <action id="Generate" /> <action id="Generate" /><component>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><implementation-class>com.example.persistentdemo.PersistentComponent</implementation-class>
  5. <action id="Generate" /> <action id="Generate" /></component>
  6. </application-components>
复制代码
获取状态与获取 <action id="Generate" />component <action id="Generate" />的方式一样:
  1. public <action id="Generate" />static <action id="Generate" />PersistentComponent <action id="Generate" />getInstance() <action id="Generate" />{
  2. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />ApplicationManager.getApplication().getComponent(PersistentComponent.class);
  3. }
  4. public <action id="Generate" />static <action id="Generate" />PersistentComponent <action id="Generate" />getInstance(Project <action id="Generate" />project) <action id="Generate" />{
  5. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />return <action id="Generate" />project.getComponent(PersistentComponent.class);
  6. }
复制代码
九、插件依赖

开发插件时可能会用到其他插件,可能是 <action id="Generate" />IDEA <action id="Generate" />绑定的,也可能是第三方的插件。
配置插件依赖需要将插件包添加到 <action id="Generate" />SDK <action id="Generate" />的 <action id="Generate" />classpath <action id="Generate" />中,并在 <action id="Generate" />plugin.xml <action id="Generate" />配置。

配置 <action id="Generate" />plugin.xml在 <action id="Generate" />plugin.xml <action id="Generate" />的 <action id="Generate" />部分添加所依赖插件的id。
  1.  org.jetbrains.kotlin
复制代码
plugin <action id="Generate" />id <action id="Generate" />可以从插件包的 <action id="Generate" />plugin.xml <action id="Generate" />文件查看。
十、GUI <action id="Generate" />介绍

GUI <action id="Generate" />是 <action id="Generate" />IntelliJ <action id="Generate" />IDEA <action id="Generate" />提供的一个自动生成 <action id="Generate" />java <action id="Generate" />布局代码的工具,它使用 <action id="Generate" />JDK <action id="Generate" />中的 <action id="Generate" />Swing <action id="Generate" />控件来实现 <action id="Generate" />UI <action id="Generate" />界面。
使用步骤:
1.配置

配置 <action id="Generate" />GUI首先打开 <action id="Generate" />Settings <action id="Generate" />对话框,选择 <action id="Generate" />Editor <action id="Generate" />| <action id="Generate" />GUI <action id="Generate" />Designer,如图,在 <action id="Generate" />Generate <action id="Generate" />GUI <action id="Generate" />into: <action id="Generate" />有两个选项,生成 <action id="Generate" />class <action id="Generate" />文件或 <action id="Generate" />java <action id="Generate" />代码,我们选择生成 <action id="Generate" />java <action id="Generate" />代码,因为建好布局后可能需要修改代码。其他默认即可。

2.创建 <action id="Generate" />form

创建 <action id="Generate" />form <action id="Generate" />文件form <action id="Generate" />文件用于记录界面布局。在相应的 <action id="Generate" />package <action id="Generate" />上右键,选择 <action id="Generate" />New <action id="Generate" />| <action id="Generate" />GUI <action id="Generate" />Form,如图,输入 <action id="Generate" />form <action id="Generate" />文件名,一般与 <action id="Generate" />java <action id="Generate" />文件名相同,点击 <action id="Generate" />OK <action id="Generate" />创建 <action id="Generate" />form <action id="Generate" />与 <action id="Generate" />java <action id="Generate" />文件。

3.面板介绍

编辑界面打开 <action id="Generate" />form <action id="Generate" />文件,如图,通过拖拽控件来搭建布局。每个form文件布局的 <action id="Generate" />root <action id="Generate" />控件都是一个 <action id="Generate" />JPanel,可将该 <action id="Generate" />root <action id="Generate" />对象传给需要该布局的类。注意:左下角的属性面板,只有当填写了 <action id="Generate" />field <action id="Generate" />name <action id="Generate" />属性时该控件的对象才会被当成成员变量,否则为局部变量。

4.构建

生成 <action id="Generate" />java <action id="Generate" />代码搭建好布局后,点击 <action id="Generate" />build
编译按钮,即可生成 <action id="Generate" />java <action id="Generate" />的源码文件。
GUI <action id="Generate" />生成的方法名前后都有三个 <action id="Generate" />\(标识,当再次修改布局时,GUI <action id="Generate" />只会修改\) <action id="Generate" />标识的方法。

十一、源码分析SmartConverter

SmartConverter <action id="Generate" />-- <action id="Generate" />POJO <action id="Generate" />Object <action id="Generate" />Converter
项目地址:https://github.com/zitiger/smartconverter
1、项目背景

在分层开发中,我们总是面临着各种POJO(DTO,DO,JO,VO)对象之间的相互转换。当对象比较复杂时,编写转换代码耗时较多,且非常容易出错。以至于可能会出现写一天代码,半天在写各种convert的囧境。
为了实现自动转换,出现了BeanUtil和ModelMapper等解决方案。这些方案,在少量对象转换时,性能损耗可以忽略,但是当转换数量达到一定量级时,这种损耗会对性能产生影响。
本插件可以自动生成POJO之间的转换代码,省去手工转换的麻烦,也不会损失性能。
2、安装

下载SmartConverter.zip,并在Intellij <action id="Generate" />Idea中安装;
3、四个转换函数


4、单个抓换函数


5、插件特色

插件自动从转换函数的参数和返回值推断出转换POJO;
支持List之间的转换。
如果存在单个转换的函数,则直接使用
如果不存在单个转换的函数,创建单个转换函数
支持嵌套转换

6、源码解读

6.1.如何将ConvertGeneratorAction <action id="Generate" />添加到菜单

因为使用SmartConvert是使用alt+insert弹出或者右键点击Generate显示SmartConvertAction,所以根据前文的添加位置不难推断添加在弹出菜单EditorPopupMenu下,这个时候我们可以从两个方向找他添加的位置。
首先从项目的配置文件进入找到plugin.xml下配置的action。由此不难看出它实际是添加在了GenerateGroup这个组上的
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><actions>
  12. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  15. <action id="Generate" /> <action id="Generate" /></group>
  16. </actions><actions>
  17. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  20. <action id="Generate" /> <action id="Generate" /></group>
  21. </actions><actions>
  22. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  25. <action id="Generate" /> <action id="Generate" /></group>
  26. </actions><actions>
  27. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  30. <action id="Generate" /> <action id="Generate" /></group>
  31. </actions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码

这个时候我们不难看出并没有地方引用这个组,这个时候我们不防从使用的地方入手,我们是右键点击Generate或者alt+insert弹出的EditorLangPopupMenu下的Generate的组。这个时候我们去全局搜索EditorPopupMenu
发现这里有一个添加到右键菜单下的
  1. <actions>
  2. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  3. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  4. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  5. <action id="Generate" /> <action id="Generate" /></group>
  6. </actions><actions>
  7. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  8. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  9. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  10. <action id="Generate" /> <action id="Generate" /></group>
  11. </actions><actions>
  12. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  13. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  14. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  15. <action id="Generate" /> <action id="Generate" /></group>
  16. </actions><actions>
  17. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  18. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  19. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  20. <action id="Generate" /> <action id="Generate" /></group>
  21. </actions><actions>
  22. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  23. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  24. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  25. <action id="Generate" /> <action id="Generate" /></group>
  26. </actions><actions>
  27. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  28. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  29. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  30. <action id="Generate" /> <action id="Generate" /></group>
  31. </actions><actions>
  32. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  33. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  34. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  35. <action id="Generate" /> <action id="Generate" /></group>
  36. </actions><actions>
  37. <action id="Generate" /> <action id="Generate" /><group <action id="Generate" />id="MyPlugin.SampleMenu" <action id="Generate" />text="Sample <action id="Generate" />Menu" <action id="Generate" />description="Sample <action id="Generate" />menu">
  38. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><add-to-group <action id="Generate" />group-id="MainMenu" <action id="Generate" />anchor="last" <action id="Generate" /> <action id="Generate" />/>
  39. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><action <action id="Generate" />id="Myplugin.ActionDemo" <action id="Generate" /> <action id="Generate" />text="Text <action id="Generate" />Boxes" <action id="Generate" />description="A <action id="Generate" />test <action id="Generate" />menu <action id="Generate" />item" <action id="Generate" />/>
  40. <action id="Generate" /> <action id="Generate" /></group>
  41. </actions><extensions <action id="Generate" />defaultExtensionNs="com.intellij">
  42. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><applicationService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo"/>
  43. <action id="Generate" /> <action id="Generate" /> <action id="Generate" /> <action id="Generate" /><projectService <action id="Generate" />serviceImplementation="com.example.test.persisting.PersistentDemo2"/>
  44. <action id="Generate" /> <action id="Generate" /></extensions> <action id="Generate" /> <action id="Generate" /> <action id="Generate" />
复制代码
点击后跳转的是
  1. <action id="Generate" />
复制代码
GenerateAction的点击方法actionPerformed内动态生成了ActionGroup
  1. JBPopupFactory.getInstance().createActionGroupPopup(CodeInsightBundle.message("generate.list.popup.title"), <action id="Generate" />wrapGroup(getGroup(),dataContext,project),dataContext,JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, <action id="Generate" />false);
复制代码
而getGroup() <action id="Generate" />通过指定groupid <action id="Generate" />获取到GenerateGroup的Action组
  1. return <action id="Generate" />(DefaultActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_GENERATE);
复制代码

6.2.如何实现实体~~~~转换

2.1Program <action id="Generate" />Structure <action id="Generate" />Interface <action id="Generate" />(PSI)
https://plugins.jetbrains.com/docs/intellij/psi-files.html
程序结构接口,通常简称为 <action id="Generate" />PSI,负责解析文件并创建语法和语义代码模型,为平台的众多功能提供支持。
PSI文件是结构的根,将文件内容表示为特定编程语言中元素的层次结构
PsiFile是所有 <action id="Generate" />PSI <action id="Generate" />文件的公共基类,而特定语言的文件通常由其子类表示。例如PsiJavaFile类代表一个Java文件,类XmlFile代表一个XML文件。
2.2查看某一个文件的PSI结构
参考文档:PSI <action id="Generate" />Viewer
https://www.jetbrains.com/help/idea/psi-viewer.html?_ga=2.203993552.1175576577.1685324427-1690948556.1684890471&_gl=1y6ns8zgaMTY5MDk0ODU1Ni4xNjg0ODkwNDcxga_9J976DJZ68*MTY4NTQxNDQzMS4xOS4xLjE2ODU0MTU2NTguMC4wLjA.
未配置开启查看PIS结构时如下图

开启查看PIS结构 <action id="Generate" />找到idea安装路径下的bin目录下的idea.properties配置如下
  1. idea.is.internal=true
复制代码

开启后显示了View <action id="Generate" />PSI <action id="Generate" />Structure <action id="Generate" />和View <action id="Generate" />PSI <action id="Generate" />Structure <action id="Generate" />of <action id="Generate" />Current <action id="Generate" />File

进入要查看结构的文件后点击View <action id="Generate" />PSI <action id="Generate" />Structure <action id="Generate" />of <action id="Generate" />Current <action id="Generate" />File
查看某一个文件的psi结构

2.3查看插件源码
进入ConvertGeneratorAction的点击事件方法不难看到如下的根据PSI获取当前类和方法的代码

2.4继续跟踪生成方法转换代码
这里主要是根据返回类型获取到了一个MethodGenerator并执行对应的generateCode方法

2.5MethodGenerator下的generateCode
MethodGenerator下的generateCode主要获取了当前方法的入参fromClass与toClass,并进行了字符串的组装和生成代码块。

PsiCodeBlock <action id="Generate" />codeBlock <action id="Generate" />= <action id="Generate" />elementFactory.
createCodeBlockFromText("{" <action id="Generate" />+ <action id="Generate" />String.join("\n", <action id="Generate" />statementList) <action id="Generate" />+ <action id="Generate" />"}", <action id="Generate" />psiClass);
源码分析就到这里,如果有兴趣的同学可以自行深入分析并欢迎补充。
十二、武魂融合

1.定位

想编写一个什么样的插件(功能)
插件要实现的能力是什么,eg:进行方法入参快速转为出参、获取选择的文本添加为笔记、idea激活弹出框、数据库Database...等。
2.拆解

实现插件需要具备哪些能力(功能拆解)
需要页面操作交互能力(java <action id="Generate" />swing)
需要发送http请求能力(添加依赖的能力)
需要添加action的能力(插件需要放在哪里,插件的生命周期是什么等级的等。)

需要读写文件的能里(new <action id="Generate" />BufferedWriter(new <action id="Generate" />OutputStreamWriter(new <action id="Generate" />FileOutputStream(file),"utf-8"))
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4