如何覆盖IntelliJ插件中的服务实现?

时间:2013-09-12 14:02:20

标签: java intellij-idea intellij-plugin

如何在我的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

有人可以提供一些提示吗?

非常感谢你!!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

ApplicationManager.getApplication().getPicoContainer()并将其投放到MutablePicoContainer,然后您就可以取消注册/重新注册某个组件。

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