Eclipse插件开发:插件A在插件B中使用了一个Class,导出为jar后安装到eclipse中,出现NoClassDefFoundError

Eclipse Plug-ins develop: Plug-in A use a Class in Plug-in B, after exporting as jars and installed in to eclipse, NoClassDefFoundError occurs

Plugin A使用了一个class,ClassB,来自Plugin B.When "run as eclipse application",一切顺利;但是,当 PluginA 和 Plugin B 导出为 Jar 并安装到新的 eclipse 平台时,它们独立运行良好,但是当代码到达 Plugin A 使用 ClassB 的行时崩溃。

错误日志:ava.lang.NoClassDefFoundError 原因:java.lang.ClassNotFoundException

在插件org.jboss.vpe.browsersim.eclipse中,包org.jboss.vep.browsersim.eclipse.launcher中有BrowserSimLauncher.java;

在插件 org.ayound.js.debug.core 中,存在一个 java 文件 "JsLaunchConfigurationDelegate.java",我输入 BrowserSimLauncher.launchBrowserSim(startUrl);

进去,这意味着我在后一个插件中使用了前一个插件的class 'BrowserSimLauncher'。

我也做了所有 "dependencies things",包括向后一个插件的 manifest.mf:

添加行
Import-Package: org.jboss.tools.vpe.browsersim.eclipse.launcher

和之前插件的 manifest.mf:

Export-Package: org.jboss.tools.vpe.browsersim.eclipse.launcher

在开发环境下,两个插件都编译成功,"run as eclipse application"时,一切顺利,后一个插件可以成功调用BrowserSimLauncher.launchBrowserSim(startUrl);;
但是,当我将两个插件导出为多个.jar文件,并将它们复制到另一个eclipse目录的/plu​​gin文件夹中时,启动eclipse,两个插件都可以独立运行,但是插件调用失败BrowserSimLauncher.launchBrowserSim(startUrl);。错误日志显示如下:

    !ENTRY org.eclipse.core.jobs 4 2 2015-01-06 16:29:03.817
!MESSAGE An internal error occurred during: "Launching index.html".
!STACK 0
java.lang.NoClassDefFoundError: org/jboss/tools/vpe/browsersim/eclipse/launcher/BrowserSimLauncher
    at org.ayound.js.debug.launch.JsLaunchConfigurationDelegate.launch(JsLaunchConfigurationDelegate.java:101)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1018)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.run(DebugUIPlugin.java:1222)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: java.lang.ClassNotFoundException: org.jboss.tools.vpe.browsersim.eclipse.launcher.BrowserSimLauncher cannot be found by org.ayound.js.debug.core_2.2.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 6 more

后面的插件(js.debug.core)找不到前面的插件(browsersim.eclipse)!

如果您只是将插件复制到 Eclipse 'plugins' 目录中,那么您需要在启动 Eclipse 时指定“-clean”选项以使其重建插件依赖项缓存。

您可以在 Eclipse 命令行或 eclipse.ini 文件中指定“-clean”(这里它必须在任何 -vmargs 行之前)。

始终指定 -clean 是安全的,但它会稍微减慢 Eclipse 的启动速度。

补充:

只需使用“-clean”选项启动 eclipse,问题就解决了。详情来自reference article:

它的作用:

if set to "true", any cached data used by the OSGi framework and eclipse runtime will be wiped clean. This will clean the caches used to store bundle dependency resolution and eclipse extension registry data. Using this option will force eclipse to reinitialize these caches.

使用方法:

  • 编辑位于 Eclipse 安装目录中的 eclipse.ini 文件并插入 -clean 作为第一行。
  • 或者编辑用于启动 Eclipse 的快捷方式并添加 -clean 作为第一个参数。
  • 或者创建一个批处理或 shell 脚本,使用 -clean 参数调用 Eclipse 可执行文件。此步骤的优点是您可以保留脚本并在每次要清理工作区时使用它。您可以将其命名为 eclipse-clean.bat(或 eclipse-clean.sh)。

(来自:http://www.eclipsezone.com/eclipse/forums/t61566.html

其他 eclipse 命令行选项:http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fmisc%2Fruntime-options.html