1

我正在构建 2 个 eclipse 插件;让我们称它们为插件 A 和插件 B ......

插件 A 需要许可证才能运行,插件 B 对全世界免费。我在插件 B 中创建了一个扩展点,插件 A 贡献(并且在某些情况下覆盖)数据。如果插件 A 未获得许可(无需检查插件是否可以启动),我想找到一种方法来忽略插件 B 中的数据。

eclipse中是否有这样的机制可以让我完成这样的壮举?我目前的解决方法是检查插件是否已启动(通过捆绑包)以及是否未尝试启动它。start()如果插件 A 未经许可,我会在方法中抛出异常。

4

3 回答 3

1

如果没有获得许可,A 是否不应该检查其许可证本身并且不覆盖/不提供任何数据(或通过提供相同的数据来覆盖)?当本质上 B 不关心时(因为它是免费的),为什么要把许可证检查的负担放在 B 身上。

如果找不到许可证,我会选择 A 以受限模式启动。您可能还 - 正如 jamesh 建议的那样 - 想要让用户有机会提供许可证,例如,使用额外的 A-UI 插件通知用户缺少许可证并提供许可证。

于 2009-03-07T12:35:51.940 回答
0

要求

因此,您正在编写两个插件。

插件 B 有一个扩展点。如果用户拥有插件 A 的捆绑包和许可证,那么插件 A 应该为插件 B 中的 EP 贡献扩展。

方法

OSGi 的安全模型主要建立在默认的 Java Permissions 和 SecurityManager 之上。Apache Felix在此演示文稿中进行了讨论。我希望有可能围绕这个建立一个许可计划。

您的解决方法听起来像是可行的,但是,有几个问题:

  • 停止启动捆绑包可能会阻止注册任何服务,但它会影响扩展注册表的更改吗?即那些使用plugin.xml 注册的扩展。我猜 DS 服务应该没问题,但我必须尝试一下。
  • 停止捆绑可能还不够——以后可以重新开始吗?我可能希望它卸载。
  • 未经许可的捆绑包是告诉用户有关许可的机会。那么,您如何告诉用户该捆绑包未获得许可,并且无法使用,顺便说一句,这就是您许可它的方式。

到目前为止,您还没有谈到如何实施许可证。我猜你会选择 LicenseService,甚至可能是单例。

请报告您的发现。

于 2009-01-28T17:38:06.257 回答
0

我能想到的一种可能的解决方案是,您将插件 A 中的类贡献给插件 B。然后,当插件 B 读取贡献项时,它可以尝试创建此类的实例。

如果没有许可,插件 A 中的类可以在构造函数中抛出一些异常。这将告诉插件 B 来自插件 A 的信息可以忽略。

插件 B 中的可能实现如下所示:

    IExtensionPoint extensionPoint = registry.getExtensionPoint("mypoint");
    IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
    for (int i = 0; i < elements.length; i++) {
      try {
        (License)elements[i].createExecutableExtension("class");
        // ..... Read any other items you need....
      }
      catch(LicenceException e){
        // Plugin is invalid, do not use
      }
    }
于 2009-01-29T08:34:37.537 回答