我们已经为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中的类,看起来很容易让我感到困惑。 我错过了什么?
此致 费尔南多
答案 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类。
- 如果P以“java”开头。 || P被启动委托
return parent.loadClass(C)- 如果P被导入
return exporter.loadClass(C)- 如果P由某些必需的捆绑包导出
对于每个出口商
如果找到则返回exporter.loadClass(C)- 如果在本地找到C 返回C
- 如果在片段中找到C则 返回C
- 如果P是动态导入的 return exporter.loadClass(C)
- 如果为此捆绑包启用了好友加载 返回BuddyLoader.loadClass(C)
- 抛出ClassNotFoundException
醇>
步骤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.*