【问题标题】:Override existing Eclipse plugin extension覆盖现有的 Eclipse 插件扩展
【发布时间】:2011-10-28 20:04:26
【问题描述】:

我有一个提供扩展点的现有 Eclipse 插件。该插件使用标准 Eclipse 机制来查找扩展。在这个插件的代码中,下面的代码是用来获取扩展的。

IConfigurationElement[] config = Platform.getExtensionRegistry()
            .getConfigurationElementsFor(extensionPoint);
if (config.length > 0) {
    return config[0];
}

正如您在代码中看到的,仅使用第一个找到的扩展名。这个插件已经提供了一个扩展,默认情况下使用这个扩展。

现在我需要覆盖默认扩展的行为,所以我创建了一个新插件并扩展了相同的扩展点。但事实证明,默认扩展名总是IConfigurationElement数组中的第一个,所以总是被拾取。

如何让我自己的插件首先出现在找到的IConfigurationElement 数组中,然后使用我自己的插件而不是默认插件?

现有插件是其他人编写的,除非绝对必要,否则我不想对其进行更改。

【问题讨论】:

    标签: java eclipse eclipse-plugin


    【解决方案1】:

    我想说这是从扩展点获取扩展的不好方法,无论哪种方式。如果他们只想使用插件系统加载他们创建的特定扩展,他们可以改用getConfigurationElementsFor(String namespace, String extensionPointName, String extensionId) 方法并关闭其他人使用扩展点的可能性。到目前为止,还不确定他们将获得哪个扩展名。很可能,稍后代码中的某些实例假设他们将获得他们的扩展名,当他们没有得到他们期望的扩展名时,ClassCastException 先生来敲门。 (曾经在系统中出现过这样的错误)

    当然最好的办法是改代码来处理很多扩展!

    但是对于你的问题;我不知道 ExtensionRegistry 是如何填充数组的,API 没有说。也许有一种方法可以设置扩展的特定版本,使其可以放在数组的第一个位置。您必须查看 ExtensionRegistry 的代码才能准确了解扩展是如何找到的。我认为它可能是按字母顺序排列的,但我不确定。

    另一种方法是用您的插件重载现有插件并替换功能。一种非常肮脏的方法,但在某些情况下是可行的。 See one of my questions regarding this

    【讨论】:

    • ExtensionRegistry 以非确定性方式返回扩展。即在不同的计算机上以不同的顺序安装插件可能会首先返回覆盖......但不能保证。扩展点消费者的工作是对他们想要的扩展进行排序/优先排序/挑选。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多