Eclipse插件开发:插件A使用插件B中的类,在导出为jar并安装到eclipse后,发生NoClassDefFoundError

时间:2015-01-06 09:30:57

标签: eclipse plugins osgi

插件A使用一个类ClassB,它来自插件B.当"作为eclipse应用程序运行时,一切顺利;但是,当PluginA和插件B导出为Jar并安装到新的eclipse平台时,它们可以独立运行,但是当代码到达插件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);

进入它,这意味着我已经使用了以前的插件' BrowserSimLauncher'在后一个插件中。

我也做了所有"依赖事物",包括在后一个插件的manifest.mf中添加行:。

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

以及之前插件的manifest.mf:

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

在开发环境中,两个插件都成功编译,当"作为eclipse应用程序"运行时,情况顺利,后一个插件可以成功调用BrowserSimLauncher.launchBrowserSim(startUrl);;
但是,当我将两个插件导出为几个.jar文件,并将它们复制到另一个eclipse目录的/ plugin文件夹中时,启动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$8.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)!

1 个答案:

答案 0 :(得分:0)

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

您可以在Eclipse命令行或eclipse.ini文件中指定'-clean'(此处必须在任何-vmargs行之前)。

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

补充剂:

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

它的作用:

  

如果设置为“true”,则使用任何缓存的数据   通过OSGi框架和eclipse   运行时将被擦干净。这将   清理用于存储捆绑的缓存   依赖解决和日食   扩展注册表数据。用这个   选项将迫使eclipse   重新初始化这些缓存。

如何使用它:

  • 编辑位于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