Eclipse plugin rt.jar semms не должен быть в classpath - PullRequest
1 голос
/ 18 января 2011

Мы разработали плагин для eclipse (helios), и он отлично работает в рабочей среде, но когда я пытаюсь его экспортировать и развернуть, возникает следующее исключение:

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, и меня смущает, что он отсутствует. Чего мне не хватает?

С уважением, Fernando

Ответы [ 2 ]

0 голосов
/ 18 января 2011

После прочтения OSGi и Equinox я лучше понимаю загрузчик классов OSGi.

Алгоритм поиска классов

Здесь мы предполагаем, чтопакет пытается загрузить некоторый класс C в пакет P.

  1. , если P начинается с "java".||P является делегированным при загрузке
    return parent.loadClass (C)
  2. , если P импортирован
    return exporter.loadClass (C)
  3. , если P экспортируется некоторыми необходимыми пакетами
    для каждого экспортера
    вернуть exporter.loadClass (C), если найден
  4. , если C найден локально
    вернуть C
  5. , если C найден во фрагменте
    вернуть C
  6. , если P динамически импортируется
    возвращать exporter.loadClass (C)
  7. , если для этого пакета включена загрузка друзей, возвращать BuddyLoader.loadClass (C)
  8. throw aClassNotFoundException

Шаг 7 не является стандартным поведением OSGi.Equinox добавляет этот шаг.

Шаг 1 гарантирует, что все пакеты java. * Неявно доступны для всех пакетов - их не нужно явно импортировать.Однако все остальные пакеты из JRE должны быть явно импортированы.Это означает, что существует соответствующий экспортер.Спецификация OSGi гласит, что System Bundle должен экспортировать дополнительные пакеты из JRE.

System Bundle известен как org.eclipse.osgi в Equinox.Он поддерживает набор профилей, в котором перечислены стандартные пакеты API, доступные в общих библиотеках классов JRE, таких как J2SE1.4, J2SE1.5 и JCL Foundation.Эти профили не включают в себя специфичные для реализации пакеты, такие как com.sun. * И sun. *, Поскольку они не являются стандартными и доступны не во всех JRE.

В шаге 1 алгоритма загрузки классов упоминается понятиезагрузки делегирования.Это механизм переопределения, который идентифицирует конкретные пакеты, чьи загрузки классов должны исходить из загрузчика родительского класса.Это полезно для доступа к пакетам, которые не являются java. * И не экспортируются каким-либо другим способом.Чтобы получить доступ к таким пакетам, вы можете либо обновить профиль JRE, либо использовать свойство org.osgi.framework.bootdelegation в config.ini, чтобы вывести список доступных префиксов пакетов следующим образом:

org.osgi.framework.bootdelegation=com.sun.*,sun.*
0 голосов
/ 18 января 2011

JdbcOdbcDriver действительно упакован в rt.jar, который должен автоматически включаться в classpath. Если он не существует, я считаю, что ваш rt.jar в затмении и в средах развертывания отличается:

  • версии разные
  • продавцы разные.

Вы не упомянули, как вы развертываете свое приложение. Я считаю, что вы можете скомпилировать ваше заявление. Если вы используете драйвер непосредственно в своем коде, он находится в вашем classpath при компиляции. В этом случае проверьте, в чем разница между компиляцией и средой выполнения.

Если вы ссылаетесь на этот драйвер через динамическую загрузку классов: Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"), проблема просто не может быть определена во время компиляции.

В этом случае сначала попробуйте нажать Ctrl-Shift-T, наберите JDbcOdbcDriver и посмотрите, найдет ли Eclipse что-то. Если да, посмотрите, что он идет от rt.jar и что это тот самый rt.jar, который используется вашим JDK, настроенным в Eclipse. Возможно, у вас есть несколько JDK: один из них содержит драйвер, а другой нет?

...