zoukankan      html  css  js  c++  java
  • intellij 插件结构(文件结构以及概念层面上的结构)

    1、插件内的文件

    2、插件类加载器

    3、插件组件(component)

    4、插件的扩展以及扩展点(Extensions、Extension Points)

    5、插件的Action

    6、插件的Service

    7、插件配置文件结构

    8、插件依赖

    插件内的文件

    有两种方式组织你的插件目录内的文件。

    1、插件相关的 jar 文件放在插件根目录下

    2、jar 文件放在 lib 文件夹下

    如下:实际上,大部分都是插件目录下放个lib文件夹,把插件放到 lib 下。

    我们通过 idea 的 build 菜单的 "prepare plugin moudle xxx for deployment" 生成的插件文件内,解压也是一个 lib 文件夹,里面放插件。

    除此之外,plugin.xml 文件应该放在 META-INF 文件夹下保存。

    插件类加载器

    每一个插件都可以有一个独立的类加载器,这样的好处是,允许不同插件可以使用不同版本的库。

    默认情况下,插件不会使用 IDE 的类加载器,所以 plugin.xml 中的 depends 的 <depends>com.intellij.modules.platform</depends> 如果不加上去,插件打包之后并不会生效。

    你也可以使用 <depends> 元素来指定一个或多个当前插件所依赖的插件,这样一来,我们就可以在当前插件使用其他插件的类加载器,这样我们就可以引用其他插件里面定义的类。

    插件组件

    插件组件是插件集成的基础概念,有三种组件:

    1、应用级组件(Application level components):IDE 启动的时候会创建和初始化。我们可以通过 Application 实例来获取这些组件。(通过 ApplicationManager获取Application实例,application.getComponent(Class))

    2、项目级组件(Project level components):该类组件为每个 Project 实例创建。我们可以通个 Project 实例来获取这些组件。(通过 Project project = anActionEvent.getData(PlatformDataKeys.PROJECT); 获取 Project 实例,project.getComponent(Class))

    3、模块级组件(Module level components):该类组件为每个 project 的 Moudule 创建。我们可以通过 Module 实例来获取这些组件。

    我们插件定义的每一个组件(component) 应该在配置文件中配置相关的接口(可选)和实现类,如下:

    <application-components>
        <component>
          <implementation-class>com.eleven24.HelloWorldRegistration</implementation-class>
        </component>
      </application-components>
    

    配置的实现类将会被用于组件实例化。

    两个相同级的组件不能有相同的接口类。

    每个组件有一个唯一的名字用来作为外部标识或者内部需要,通过组件的 getComponentName() 返回:

    public class HelloWorldRegistration implements ApplicationComponent {
        @NotNull
        public String getComponentName() {
            return "HelloWorldPlugin";
        }
    }
    

      

    组件命名

    推荐使用 <plugin_name>.<component_name> 的方式命名。

    应用级组件

    一个应用级的组件实现类可以选择是否去实现 ApplicationComponent 接口。

    一个没有任何依赖的组件应该有一个空参数的构造方法用以实例化。如果组件依赖其他组件,可以在构造方法参数中指定依赖的组件。IntelliJ Platform 会确保以正确的顺序来实例化组件,以保证我们组件可以正确实例化。

    应用级组件必须在 plugin.xml 的 <application-components> 块中注册。

    项目级组件

    一个 Project 级的组件可以选择是否去实现 ProjectComponent 接口。

    一个 project 级的组件如果需要 Project 实例,可以在该组件类的构造方法中指定一个 Project 类型的参数。同时如果依赖其他组件也可以指定其他 Application level 或者 Project level 的组件作为构造方法参数。

    project 级组件必须在 plugin.xml 的 <project-components> 块中注册。

    模块级组件

    一个 Module 级的组件可以选择是否去实现  ModuleComponent 接口。

    一个 Module 级组件可以在构造方法指定一个 Module 类型的参数。同时如果依赖其他组件,也可以指定 application level、projetc level 或 module level 组件作为参数。

    module 级组件必须在 plugin.xml 的 <module-components> 块中注册。

    组件状态的持久化

    如果组件类实现了  JDOMExternalizable 或者  PersistentStateComponent 接口,组件的状态将会自动保存和加载。

    当组件类实现了  PersistentStateComponent 接口,组件状态会保存在一个 xml 文件中,你可以通过 @State 和 @Storage 注解来指明当前的状态。

    当组件实现了 JDOMExternalizable 接口,组件将会在下面的文件中保存它们的状态:

    - project 级的组件的状态会保存在 .ipr 文件中,如果 plugin.xml 的 workspace 选项被设置为 true,将会被保存在 .iws 文件而不是 .ipr 文件中。

    - module 级的组件状态将会保存在 .iml 文件中

    更多信息可查看:Persisting State of Components

    插件默认配置

    定义在 <component_name>.xml 文件中,该文件需要放在 默认 package 的 classpath 下。

    如果插件有默认配置,readExternal() 将会被调用两次:

    1、第一次读取默认配置

    2、第二次读取保存的配置

    插件组件生命周期

    组件按下面的顺序加载:

    1、创建 - 构造方法被调用

    2、初始化 - initComponent 方法被调用(前提是实现了  ApplicationComponent 接口)

    3、配置 - readExternal 方法被调用(前提是实现了  JDOMExternalizable 接口),或者 loadState  被调用 (组件实现了  PersistentStateComponent 接口)

    4、对于 module 组件, 如果一个模块被添加到 project, ModuleComponent 接口的 moduleAdded 方法将会被调用。

    5、对于 project 组件,如果一个 project 被加载完, ProjectComponent 接口的 projectOpened  方法将会被调用。

    组件按下面的顺序卸载:

    1、保存配置 - writeExternal  被调用(如果该组件实现了 JDOMExternalizable 接口),getState  被调用(如果组件实现了 PersistentStateComponent 接口)

    2、清理 -  组件的 disposeComponent 方法被调用

    注意,不能在组件的构造方法中使用 getComponent() 方法去获取其他组件,如果你需要获取其他组件,可以将它们加到构造方法的参数中,或者在 initComponent  方法再进行此种操作。

    todo: 添加例子

    插件的扩展以及扩展点

    Intellij 平台提供了允许一个插件与其他插件或者 IDE 交互的 extensions 以及 extension points 的概念。

    extension points

    如果你想要你的插件可以被其他插件使用,那么你必须在你的插件内声明一个或多个扩展点(extension points)。每个扩展点定义了允许访问这个点的类或者接口。

    extensions

    如果你想要你的插件扩展其他插件或者 Intellij 平台,你必须声明一个或多个 extensions

    怎样声明 extensions 以及 extension points

    你可以在你的 plugin.xml 中的 <extensions> 和 <extensionPoints> 块中定义 extensions 以及 extension points。

    定义一个 extension point

  • 相关阅读:
    jq中的ajax
    浅谈ajax的优点与缺点
    jq模拟操作
    Spring注解使用和与配置文件的关系
    Spring中@Autowired注解、@Resource注解的区别
    分页技术
    动态的把固定格式的json数据以菜单形式插入
    web.xml文件中context-param、listener、filter、servlet的执行顺序
    spring MVC controller中的方法跳转到另外controller中的某个method的方法
    spring mvc后台如何处理ajax的请求,并返回json
  • 原文地址:https://www.cnblogs.com/eleven24/p/8290193.html
Copyright © 2011-2022 走看看