【问题标题】:Patch/Merge plugin.properties file in plugin by using fragment使用片段修补/合并插件中的 plugin.properties 文件
【发布时间】:2010-10-14 01:16:03
【问题描述】:

在我的插件 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

【问题讨论】:

    标签: eclipse plugins merge patch fragment


    【解决方案1】:

    How to Internationalize your Eclipse Plug-In文章

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

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

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

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

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


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

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

    【讨论】:

    • 这听起来像资源文件是不可能的。但是对于 Java 类,它可以工作。也许我可以修补 Eclipse 包加载器,使其首先查看片段而不是插件。
    【解决方案2】:

    我实现的解决方案是这样的

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

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

    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 + '!';
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多