【问题标题】:Eclipse Plugin Extension Point and Extension working in only Debug environmentEclipse 插件扩展点和扩展仅在调试环境中工作
【发布时间】:2017-09-09 16:18:23
【问题描述】:

我有一个 Eclipse 插件并创建了一个新的扩展点,所有设置都显示在链接中:http://www.vogella.com/tutorials/EclipseExtensionPoint/article.html

现在使用这个扩展点创建了一个带有扩展的新插件,也显示在上面的链接中。现在,当我在调试环境中运行它时,一切正常,但是当我将这两个插件从 Eclipse 导出到插件 jar 文件并与我的应用程序一起使用时,它会失败。

这是我从 Eclipse 网站获取插件信息的代码:

       IExtensionRegistry reg = Platform.getExtensionRegistry();
       IExtensionPoint ep = reg.getExtensionPoint("com.proper.package.ProperExtPointId");
       IExtension[] extensions = ep.getExtensions();
       contributors = new ArrayList();
       for (int i = 0; i < extensions.length; i++) 
       {
          IExtension ext = extensions[i];
          IConfigurationElement[] ce = 
             ext.getConfigurationElements();
          for (int j = 0; j < ce.length; j++) 
          {
             Object obj = ce[j].createExecutableExtension("ProperExtPointClass");
             contributors.add(obj);
          }
       }

代码在 CoreException 中失败: org.eclipse.core.runtime.CoreException: Plug-in TempPlugin5 was unable to load class com.....(该类实现了具有扩展点的插件接口) . . 引起:java.lang.NoClassDefFoundError: com.IInterface

所有这些设置在 Eclipse 中运行以调试这些插件并加载所有依赖插件时工作正常,但在导出以用作我的应用程序中的插件 jar 时失败。

试过remotedebugging,代码在这一行失败:

Object obj = ce[j].createExecutableExtension("ProperExtPointClass");

我试图寻找这种问题都找不到。我觉得我缺少一些 Eclispe 在调试时可用但在导出插件以使用完整应用程序时不可用的依赖项。

总而言之:具有扩展点和接口的插件 1。而PLugin2(依赖Plugin1)就是使用这个Extension point,实现plugin1的接口。根据 Stacktrace:Plugin2 无法看到 Plugin1 的接口。我在 Plugin1 的“runtime”选项卡的“Exported packages”中有 Interface 的包。

TIA。

【问题讨论】:

  • 你有没有尝试过干净的重建,我不知道为什么,但很多时候当我收到NoClassDefFoundError 时,构建中的某些东西会被破坏
  • 感谢您的帮助。是的,我已经尝试过彻底清洁。我不工作。

标签: java eclipse eclipse-plugin


【解决方案1】:

您的插件可能不包含正确的依赖项。调试时未仔细检查依赖项,因此此问题显示在发布版本中。

在您的插件MANIFEST.MF 中,您必须使用Require-Bundle 列出您所依赖的插件,或者您可以使用Import-Package 列出您所依赖的Java 包。

您可以在 MANIFEST.MF 编辑器的“依赖项”选项卡上设置这些值。

另请注意,如果您在插件中包含任何额外的 jar,则它们必须列在 build.properties 文件的 bin.includes 部分中。

【讨论】:

  • 谢谢,我已将所需的插件添加为依赖项选项卡。在导出的罐子里。我可以看到:Require-Bundle:com.plugin="8. 6.0"。而且我没有蚂蚁外部罐子。
  • 您的哪些插件使用com.IInterface?那个界面在哪里?使用该接口的插件是否在其依赖项中包含它?
  • 我已经在问题中进行了编辑,如果仍然不清楚,请告诉我。谢谢。
  • 那么 Plugin2 是否有一个用于 Plugin1 的 Require-Package 或一个用于接口的 Import-Package
  • Plugin2 Manifest 包含: Require-Bundle: com.Plugin1;bundle-version="8.6.0" 并且在plugin2 中有一个实现Plugin1 接口并提供方法实现的类。我在 Plugin2 Manifest 中没有任何 Require-Package 条目。
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多