使用片段在插件中修补/合并plugin.properties文件

时间:2009-03-18 10:48:43

标签: eclipse plugins merge patch fragment

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

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

我想使用eclipse片段机制修补属性文件。就我而言,片段插件可以在运行时修补相应的插件。

我在plugin 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

3 个答案:

答案 0 :(得分:1)

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

  

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

     

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

     

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

     

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

     

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


我怀疑classLoader在plugin.name片段之前的de.support.help插件中检测到de.support.help.fragment

此时,我不确定是否可以这样做,因为之前已尝试过(Eclipse CheckStyle plugin),但没有取得多大成功。

答案 1 :(得分: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 + '!';
        }
    }
}

答案 2 :(得分:1)

您无法使用片段替换文件内容 - 仅添加其他文件。对于类,属性文件,图像......都是如此。

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

  • 您可以使用此客户特定信息和其他客户特定信息添加扩展点。
  • 你可以先找一个特殊的文件,这可以追溯到一般文件 - 正如Markus所做的那样。
  • 您可以使用相关信息对插件进行可选的依赖。

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