зависимости подключаемого модуля eclipse и исключение classnotfoundexception

Я новичок в разработке подключаемого модуля Eclipse RCP, и у меня возникла следующая проблема: я пытаюсь создать экземпляр объекта MessageConsole в своем подключаемом модуле. Я создаю соответствующую зависимость для org.eclipse.ui.console в MANIFEST.MF, создаю подключаемый модуль, а затем загружаю подключаемый модуль в то же приложение Eclipse (я экспортирую подключаемый модуль в виде zip-архива, закрываю Eclipse, распаковываю и копирую подключаемый модуль в каталог плагинов Eclipse, перезапустите Eclipse). Я получаю NoClassDefFoundError при загрузке этого плагина. Если я раскомментирую единственную строку исходного кода (см. ниже), которая пытается создать экземпляр MessageConsole, плагин будет работать нормально. Подробности следующие.

МАНИФЕСТ.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: IntrospectorPlugin Plug-in
Bundle-SymbolicName: IntrospectorPlugin; singleton:=true
Bundle-Version: 1.0.1
Bundle-Activator: introspectorplugin.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.ui.console
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

ИнтроспекторВью.java:

import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;
...
     MessageConsole myConsole = new MessageConsole("IntrospectorView plugin console",
        imageDescriptorConsole);

Исключение:

java.lang.ClassNotFoundException: org.eclipse.ui.console.MessageConsole
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:483)
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:399)
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:387)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:87)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at introspectorplugin.views.IntrospectorView.makeConsole(IntrospectorView.java:453)
    at introspectorplugin.views.IntrospectorView.createPartControl(IntrospectorView.java:436)
    at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:371)
    at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:230)
    at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:594)
    at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:306)
    at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:531)
    at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)
    at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)
    at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
    at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)
    at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1256)
    at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:668)
    at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:576)
    at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:568)
    at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:271)
    at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:968)
    at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2593)
    at org.eclipse.ui.internal.WorkbenchWindow$25.run(WorkbenchWindow.java:2873)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:2854)
    at org.eclipse.ui.internal.WorkbenchWindow$19.runWithException(WorkbenchWindow.java:2171)
    at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3800)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3425)
    at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
    at org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1363)
    at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3800)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3425)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2295)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
    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:386)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)

Я просмотрел свою книгу «Плагины», в которой говорится о том, чтобы убедиться, что зависимости времени компиляции во многом нацелены на зависимости времени выполнения — если я запускаю плагин в том же исполняемом файле Eclipse, который я создаю, у меня не должно быть этой проблемы? Кроме того, я просмотрел дерево зависимостей плагинов и убедился, что у меня есть все необходимые плагины.

Любая помощь приветствуется, спасибо!


person Community    schedule 27.07.2009    source источник


Ответы (2)


Сегодня я установил более новую версию Eclipse, добавил свой плагин в каталог плагинов, и все работает хорошо. Очевидно, я столкнулся с какой-то проблемой конфигурации или причудой. Моя предыдущая версия была Ganymede, а теперь я запускаю Galileo.

person Community    schedule 29.07.2009
comment
Спасибо за этот отзыв. +1 - person VonC; 30.07.2009
comment
блин - у меня похожая проблема, но я уже запускаю Galileo... Classloaderhell. - person Andreas Dolk; 30.07.2009

Вы можете попробовать сравнить свою реализацию с другими примерами и проектами, включая консольное представление, например:

В обоих случаях проверьте их зависимости (plugin.xml или MANIFEST.MF), чтобы увидеть, в чем разница, возможно, объясняя, почему ваш плагин не включает соответствующие классы.

person VonC    schedule 28.07.2009
comment
Спасибо за помощь VonC. Мне удалось решить проблему, просто установив новую версию Eclipse. Не очень обнадеживает, но работает. Я прошел по вашим ссылкам и сравнил файлы конфигурации моего плагина - они были почти идентичными. - person ; 30.07.2009