Eclipse插件rt.jar semms不在classpath中

时间:2011-01-18 14:50:16

标签: java eclipse eclipse-plugin classpath

我们已经为eclipse(helios)开发了一个插件,它在工作台上运行得很好,但是当我尝试导出和部署它时,正在提出跟随expcetion:

java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:506)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at learsoft.system.plugin.handlers.endOracleSession.conect(endOracleSession.java:31)
    at learsoft.system.plugin.handlers.SampleHandler.execute(SampleHandler.java:45)
    at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
    at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
    at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169)
    at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:241)
    at org.eclipse.ui.menus.CommandContributionItem.handleWidgetSelection(CommandContributionItem.java:820)
    at org.eclipse.ui.menus.CommandContributionItem.access$19(CommandContributionItem.java:806)
    at org.eclipse.ui.menus.CommandContributionItem$5.handleEvent(CommandContributionItem.java:796)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3552)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3171)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1407)

我已经在插件配置的概述选项卡中设置了使用JavaSE-1.6并尝试了几种不同的配置。 据我所知,JdbcOjdbcDriver是一个包含在rt.jar中的类,看起来很容易让我感到困惑。 我错过了什么?

此致 费尔南多

2 个答案:

答案 0 :(得分:0)

JdbcOdbcDriver实际打包到rt.jar中,必须自动包含在classpath中。如果它不存在,我相信你在eclipse和部署环境中的rt.jar是不同的:

  • 版本不同
  • 供应商不同。

您没有提到如何部署应用程序。我相信你可以编译你的申请。如果您在代码中直接使用驱动程序,那么在编译时它就在您的类路径中。在这种情况下,检查编译和运行时环境之间的区别。

如果您通过动态类加载引用此驱动程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”),则无法在编译时确定问题。

在这种情况下,首先尝试按Ctrl-Shift-T,键入JDbcOdbcDriver并查看Eclipse是否找到了某些内容。如果是,请看它来自rt.jar,这是在Eclipse中配置的JDK使用的rt.jar。可能你有几个JDK:其中一个包含驱动程序,另一个不包含?

答案 1 :(得分:0)

阅读OSGi and Equinox后,我对OSGi类加载器有了更深入的了解。

类查找算法

在这里,我们假设一个bundle正在尝试在P包中加载一些C类。

  
      
  1. 如果P以“java”开头。 || P被启动委托
      return parent.loadClass(C)
  2.   
  3. 如果P被导入
      return exporter.loadClass(C)
  4.   
  5. 如果P由某些必需的捆绑包导出
      对于每个出口商
        如果找到则返回exporter.loadClass(C)
  6.   
  7. 如果在本地找到C   返回C
  8.   
  9. 如果在片段中找到C则   返回C
  10.   
  11. 如果P是动态导入的   return exporter.loadClass(C)
  12.   
  13. 如果为此捆绑包启用了好友加载   返回BuddyLoader.loadClass(C)
  14.   
  15. 抛出ClassNotFoundException
  16.   

步骤7不是标准的OSGi行为。 Equinox增加了这一步。

步骤1确保所有捆绑包都隐式可用所有java。*包 - 它们不需要显式导入。但是,必须显式导入JRE中的所有其他包。这意味着存在匹配的导出器。 OSGi规范声明System Bundle必须从JRE导出其他包。

系统捆绑包在Equinox中称为org.eclipse.osgi。它维护一组配置文件,列出了常见JRE类库(如J2SE1.4,J2SE1.5和JCL Foundation)中可用的标准API包。这些配置文件不包含特定于实现的软件包,例如com.sun。*和sun。*,因为它们不是标准软件包,并不适用于所有JRE。

类加载算法的第1步提到了引导委派的概念。这是一种覆盖机制,用于标识其类加载应来自父类加载器的特定包。这对于访问非java。*的包并且不以其他方式导出包非常有用。要访问此类包,您可以更新JRE配置文件或使用config.ini中的org.osgi.framework.bootdelegation属性列出可访问包前缀集,如下所示:

org.osgi.framework.bootdelegation=com.sun.*,sun.*