【问题标题】:How can I override a service implementation in IntelliJ plugin?如何覆盖 IntelliJ 插件中的服务实现?
【发布时间】:2013-09-12 14:02:19
【问题描述】:

如何在我的 intellij 插件中覆盖 FrameTitleBuilder 的默认服务实现?

我使用的是 IntelliJ 12.1.4,我已经正确设置了构建插件的环境。

现在我已经尝试在一个新的插件项目中将它添加到我的 plugin.xml 中:

<extensions defaultExtensionNs="com.intellij">
    <applicationService serviceInterface="com.intellij.openapi.wm.impl.FrameTitleBuilder"
         serviceImplementation="com.my.package.MyFrameTitleBuilder"
         overrides="com.intellij.openapi.wm.impl.FrameTitleBuilder"
     />
</extensions>

但是它失败了:

org.picocontainer.defaults.DuplicateComponentKeyRegistrationException: Key com.intellij.openapi.wm.impl.FrameTitleBuilder duplicated

谁能给点建议?

非常感谢您!

【问题讨论】:

    标签: java intellij-idea intellij-plugin


    【解决方案1】:

    “overrides”属性是一个布尔值(无论如何在 IntelliJ 13 中),将其设置为 true 并首先删除旧的实现

    <extensions defaultExtensionNs="com.intellij">
        <applicationService 
             serviceInterface="com.intellij.openapi.wm.impl.FrameTitleBuilder"
             serviceImplementation="com.my.package.MyFrameTitleBuilder"
             overrides="true" />
     </extensions>
    

    【讨论】:

      【解决方案2】:

      由于我无法在 plugin.xml 中找到让我的插件覆盖服务实现的方法,我不得不通过 PicoContainer 手动“替换”它。

      ApplicationManager.getApplication().getPicoContainer() 转换为MutablePicoContainer,然后您就可以注销/重新注册组件。

      如果可能的话,我仍然想知道通过plugin.xml 执行此操作的正确格式。

      【讨论】:

        猜你喜欢
        • 2019-06-18
        • 2014-11-14
        • 2017-05-29
        • 2019-08-31
        • 1970-01-01
        • 2014-11-03
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多