IntelliJ平台提供了一些列的扩展和扩展点,使得插件可以和其他插件或者IDE本身进行交互。

扩展点

如果你想允许其他插件集成当前插件的功能特性,那么在当前插件中,必须声明一个或多个扩展点。每个扩展点定义了一个类或一个接口使得可以访问该扩展点。

扩展

如果你想使得你的插件继承其他插件的功能特性或者IntelliJ平台特性,你需要定义一个或多个 扩展

如何声明扩展和扩展点

可以通过在plugin.xml中,使用<extensions><extensionPoints>来分别定义扩展和扩展点。

声明扩展点

<extensionPoints>部分,使用子元素<extensionPoints>来定义扩展点,使用namebeanClassinterface分别指定扩展点的名字,扩展点的类、扩展点的接口。

下面为一个定义扩展点的示例:

<extensionPoints>
  <extensionPoint name="MyExtensionPoint1" beanClass="MyPlugin.MyBeanClass1">
  <extensionPoint name="MyExtensionPoint2" interface="MyPlugin.MyInterface">
</extensionPoints>
  • interface属性指定扩展点必须实现的接口。
  • beanClass属性指定的类,其有一个或多个属性会进行注解@Attribute标识。

使用了扩展点的插件会解析plugin.xml中的上述配置。

如下为上述例子中的MyBeanClass1

public class MyBeanClass1 extends AbstractExtensionPointBean {
  @Attribute("key")
  public String key;

  @Attribute("implementationClass")
  public String implementationClass;

  public String getKey() {
    return key;
  }

  public String getClass() {
    return implementationClass;
  }
}

定义扩展主要用于访问扩展点MyExtensionPoint1,在plugin.xml中需要包含<MyExtensionPoint1>标签,并设置其keyimplementationClass属性(具体参见下面的示例)。

定义扩展

  1. <extensions>标签,设置xmlns(过时)或defaultExtensionNs属性为下列其中的一个:
    • 如果插件需要继承IntelliJ平台的核心特性,则配置为com.intellij
    • 如果插件需要继承其他插件的特性,则配置为{插件ID}
  2. <extensions>中添加子标签,子标签的名字必须和需要访问的扩展点的名字一致。
  3. 访问扩展点时,使用如下方式:
    • 如果扩展点使用interface属性进行声明时,设置implementation属性为实现该接口的实现类。
    • 如果扩展点使用beanClass方式定义,那么对于beanClass中所有的带有@Attribute注解的属性进行设值。

如下示例,在plugin.xml中定义了两个扩展,第一个用于访问appStarterapplicationConfigurableIntelliJ平台的扩展点;第二个用于访问测试插件的MyExtensionPoint1扩展。

<!-- Declare extensions to access extension points in the IntelliJ Platform.
     These extension points have been declared using the "interface" attribute.
 -->
  <extensions defaultExtensionNs="com.intellij">
    <appStarter implementation="MyTestPackage.MyTestExtension1" />
    <applicationConfigurable implementation="MyTestPackage.MyTestExtension2" />
  </extensions>

<!-- Declare extensions to access extension points in a custom plugin
     The MyExtensionPoint1 extension point has been declared using *beanClass* attribute.
-->
  <extensions defaultExtensionNs="MyPluginID">
     <MyExtensionPoint1 key="keyValue" implementationClass="MyTestPackage.MyClassImpl"></MyExtensionPoint1>
  </extensions>

如何获取插件扩展点列表?

获取IntelliJ平台的可用扩展点,参考如下的xml配置文件的<extensionPoints>部分:

附加信息和示例

对于如何为IDEA创建插件的示例和详细说明,参考自定义IDEA配置对话框和Tool Windows的创建。

results matching ""

    No results matching ""