2

在我的插件 de.support.help 中是 plugin.properties 文件。这些属性文件包括首选项页面的字符串。

我想为不同的客户使用这个插件,但客户名称在属性文件中。

我想通过使用 Eclipse 片段机制来修补属性文件。就我现在而言,片段插件可以在运行时修补对应的插件。

我在插件 de.support.help 中确实有文件 plugin.properties,其中包括该行

plugin.name = Copyright XYZ

而且我确实有 fragemt de.support.help.fragment ,其中包括文件 plugin.properties 与行

plugin.name = Copyright ABC

我希望在运行时显示字符串“Copyright ABC”,但事实并非如此。很久以前我用 java 类测试过同样的东西,我记得他正在工作。片段中的 java 代码被放置到原始插件中。

你有什么想法来处理这个吗?还是我误解了片段机制?

谢谢

编辑:

当我从 de.support.help 插件中删除 plugin.properties 文件时,它按预期工作。片段文件被复制到插件目录并在运行时使用。

还是我必须修补 somce eclipse 类Can_fragments_be_used_to_patch_a_plug

4

3 回答 3

1

根据How to Internationalize your Eclipse Plug-In文章

插件片段为其目标插件提供附加功能。
在运行时,这些插件贡献与所有依赖的片段一起合并。

这些贡献可以包括代码贡献和与插件相关联的资源贡献,例如属性和 HTML 文件。

换句话说,插件可以通过插件的类加载器访问片段的内容。

Eclipse 平台以一种方式合并插件片段,片段中的运行时元素增强了原始目标插件。
目标插件不会以任何方式移动、移除或修改。

由于片段的资源由类加载器定位,因此插件开发人员无需知道资源是从插件的 JAR 文件还是从其片段的 JAR 文件之一加载的。


我怀疑 classLoader在片段之前首先plugin.namede.support.help插件中检测。de.support.help.fragment

在这一点上,我不确定它是否可以完成,因为之前已经尝试过(对于Eclipse CheckStyle 插件),但没有取得多大成功。

于 2009-03-18T11:43:14.477 回答
1

我实施的解决方案就像

首先查找特殊片段属性文件,然后查找默认属性文件。

代码是(捆绑名称已更改)

public final class FrameworkMessages {
    private static final String BUNDLE_NAME = "de.rts.messages"; //$NON-NLS-1$

    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);

    private static final String BUNDLE_FRAGMENT_NAME = "de.rts.fragment"; //$NON-NLS-1$


    private FrameworkMessages() {
    }

    public static String getString(String key) {
        try {
            return ResourceBundle.getBundle(BUNDLE_FRAGMENT_NAME).getString(key);
        } catch (MissingResourceException e) {
            // Use messages in this plugin when no external fragment files can found
        }

        try {
            return RESOURCE_BUNDLE.getString(key);
        } catch (MissingResourceException e) {
            return '!' + key + '!';
        }
    }

    public static String getString(String pKey, Object[] pArgument) {
        try {
            return MessageFormat.format(RESOURCE_BUNDLE.getString(pKey), pArgument);
        } catch (MissingResourceException e) {
            return '!' + pKey + '!';
        }
    }
}
于 2011-06-28T09:14:48.023 回答
1

您不能用片段替换文件的内容 - 只能添加其他文件。这适用于类、属性文件、图像……

有几种解决这个问题的标准方法:

  • 您可以使用此信息和其他客户特定信息添加扩展点。
  • 您可以先查找一个特殊文件,然后再返回到一般文件 - 正如 Markus 所做的那样。
  • 您可以对具有相关信息的插件有一个可选的依赖项。

我更喜欢最后一个解决方案,因为这也允许在替代算法和其他不属于 .properties 文件的东西之间进行选择......

于 2011-06-28T09:27:02.137 回答