NoClassDefFoundError Problem

Krallistic

Mitglied
Ich habe 2 verschiedenliche (Eclipse)RCP Projecte. Nun möchte Project A in B verwenden.

In der Manifest von A habe ich B unter "Required-Bundle" hinzufügt.

Während der Laufzeit b ei der ersten verwendung schmeißt er mir dann:

java.lang.NoClassDefFoundError:XYZ...

Was hab ich vergessen? Am Classpath muss ich ja eigentlich nichts maneul ändern...oder?

mfg
 
Moment...

Ich habe 2 verschiedenliche (Eclipse)RCP Projecte
Sind wirklich beides RCP Anwendungen?

Ich bin mir nicht sicher, ob das so geht, zumindest eins von beidem sollte wohl ein Plugin sein.

Ansonsten, poste mal die komplette Fehlermeldung, so kann man da wenig sagen
 
Ich dachte Plugins für Eclipse basieren immer auf RCP? Wenn nicht dann hab ich mich falsch ausgedrückt dann währen es beide nur plugins...Sorry
Code:
java.lang.NoClassDefFoundError: X/Z/Y
	at org.neontoolkit.plugin.ReductionAction.run(ReductionAction.java:73)
	at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	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:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	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)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: java.lang.ClassNotFoundException: X/Y/Z
	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:248)

mfg & Danke
 
Was tut Zeile 73 in ReductionAction denn?
Ist der erste Aufruf einer Funktionalität aus dem anderen Project.

Wenn ich raten müsste: du hast in einem der plugins den Build Path händisch angepasst um eine Bibliothek einzubinden.

Nein habe ich nicht. Ich habe:

-Das andere Project in dem Aktuellen in der manifest unter "Required-Bundle" eingefügt.
-Die RunConfiguration in Eclipse so angepasst das auch beide Plugins geladen werden.

mfg
 
Alles andere, Build-Path ändern, Projekt als Dependency eintragen,... zählt zu 'händisch den Build Path ändern' und das ist verboten.

Hattest Recht das Project war im Build-Path von einer Eclipse Funktion eingetragen(rmt->PDE Tools->Update Classpath). Hab es jetzt daraus entfernt...

Jetzt steht es nur noch im Manifest unter "required-bundel"... Habe jedoch immer noch das gleiche Problem wie am Anfang (NoClassDefFound)

Eventuell vergessen das Plugin im feature bzw. product aufzunehmen
?

mfg & Danke
 
Verwendest du Reflection, oder steht die Klasse die nicht gefunden wird im Quellcode? Wenn letzteres der Fall ist musst du schon einen Compile Fehler bekommen wenn die Klasse nicht sichtbar ist, nicht erst einen Laufzeitfehler. Wenn das aus irgendeinem Grund nicht der Fall ist, ist der Java Build Path nicht identisch mit dem was dir PDE zur Verfügung stellt und das passiert normalerweise nur wenn du irgendwelche Bibliotheken oder Projekte in den Build Path einträgst.
 
Verwendest du Reflection
Nein
Wenn letzteres der Fall ist musst du schon einen Compile Fehler bekommen
Bekomme erst zur Laufzeit den Error

irgendwelche Bibliotheken oder Projekte in den Build Path einträgst
Hatte noch 2 Bibs eingetragen. Hab aber jetzt dafür gesorgt das diese von PDE eingetragen würden...
Hab jetzt keine eigenen Änderungen am Build Path gemacht sondern alle automatisch generieren lassen.

Jedoch besteht das Problem weiterhin.
 
Hast du schonmal im plugins Tab der Launch Configuration auf validate geklickt?
Möglich das ein Bundle fehlt, allerdings sollte dein Bundle dann überhaupt nicht starten.
Wenn es daran nicht liegt, poste das log deiner Runtime Application (im runtime workspace /.metadata/.log)
 
Hast du schonmal im plugins Tab der Launch Configuration auf validate geklickt?

Ja , ist alles i.O.

poste das log deiner Runtime Application
Code:
!SESSION 2010-07-24 12:00:11.000 -----------------------------------------------
eclipse.buildId=I20100608-0911
java.version=1.6.0_20
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Framework arguments:  -product org.eclipse.platform.ide
Command-line arguments:  -product org.eclipse.platform.ide -data C:\Users\Krallistic\workspace/../runtime-EclipseApplication -dev file:C:/Users/Krallistic/workspace/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/dev.properties -os win32 -ws win32 -arch x86

!ENTRY org.eclipse.ui.workbench 2 0 2010-07-24 12:00:16.893
!MESSAGE A handler conflict occurred.  This may disable some commands.
!SUBENTRY 1 org.eclipse.ui.workbench 2 0 2010-07-24 12:00:16.893
!MESSAGE Conflict for 'AUTOGEN:::org.eclipse.ui.cheatsheets.actionSet/org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction':
HandlerActivation(commandId=AUTOGEN:::org.eclipse.ui.cheatsheets.actionSet/org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction,
	handler=ActionDelegateHandlerProxy(null,org.eclipse.ui.cheatsheets.CheatSheetExtensionFactory:helpMenuAction),
	expression=AndExpression(ActionSetExpression(org.eclipse.ui.cheatsheets.actionSet,org.eclipse.ui.internal.WorkbenchWindow@690247),WorkbenchWindowExpression(org.eclipse.ui.internal.WorkbenchWindow@690247)),sourcePriority=16640)
HandlerActivation(commandId=AUTOGEN:::org.eclipse.ui.cheatsheets.actionSet/org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction,
	handler=ActionDelegateHandlerProxy(null,org.eclipse.ui.cheatsheets.CheatSheetExtensionFactory:helpMenuAction),
	expression=AndExpression(ActionSetExpression(org.eclipse.ui.cheatsheets.actionSet,org.eclipse.ui.internal.WorkbenchWindow@690247),WorkbenchWindowExpression(org.eclipse.ui.internal.WorkbenchWindow@690247)),sourcePriority=16640)

!ENTRY org.eclipse.ui 4 0 2010-07-24 12:00:22.979
!MESSAGE Unhandled event loop exception
!STACK 0
java.lang.NoClassDefFoundError: x/y/z
	at org.neontoolkit.plugin.ReductionAction.run(ReductionAction.java:73)
	at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	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:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	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)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: java.lang.ClassNotFoundException: x.y.z
	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:248)
	... 30 more

Kommt wenn ich es nur starte und dann sofort die Funktion aufrufe die das 2te Project benötigt.
(Die Handler Warnings kann man ignorieren das ist noch eien andere Baustelle...)

mfg
 
Dann kann ich dir leider nicht mehr dazu sagen.
Wenn du das Bundle mit X/Y/Z per require-bundle eingebunden hast und dieses Bundle das Package X/Y exportiert, oder wenn du X/Y per import-package importierst, dann stellt OSGi sicher das dein Bundle gar nicht aktiviert werden kann wenn die Abhängigkeit nicht erfüllt werden kann.
Der typischen Fehler sind irgendwelche nested jars oder ein händisch angepasster Buildpath. Wenn du das bei dir definitiv ausschließen kannst, kann ich dir von hier aus nicht weiterhelfen.
 

Das zu importierende Project braucht selber mehere jars könnte das nen problem sein?

X/Y per import-package importierst, dann stellt OSGi sicher das dein Bundle gar nicht aktiviert werden kann wenn die Abhängigkeit nicht erfüllt werden kann

Wird dann auch nicht aktiviert...

Als Notlösung konnte ich das Plugin in ein jar umwandeln und dieses dann einbinden? Gib es vieleicht noch eine andere Lösung...?

mfg
 
Das zu importierende Project braucht selber mehere jars könnte das nen problem sein?
Absolut. Du darst keine Jars über den Classpath einbinden, das funktioniert zur Laufzeit nicht, darauf will ich doch die ganze Zeit hinaus 😉
Wenn du jars benötigst, mach OSGi Bundles draus, oder trage sie im Manifest als extra classpath entries ein (sie müssen dann in deinem Bundle liegen). Ersteres ist die schönere Variante, letzteres kannst du aber zum Beispiel tun um zu sehen ob das dein Problem löst.
 
Du darst keine Jars über den Classpath einbinden, das funktioniert zur Laufzeit nicht, darauf will ich doch die ganze Zeit hinaus

Ist mir schon klar. Sind auch Bundle_Classpath entrys eingetragen. Hab jetzt bei jeden Project extra nochmal den komplette ClassPath gelöscht und per PDE Tools dann neu erstellen lassen. Immer noch das gleiche..

Könnte es vieleicht daran liegen das das Plugin A mit dem benötigten Klassen doppelt geladen wird? Einmal von meinem Plugin und einmal von einen anderen Plugin welche ich aber auch benötige?

mfg
 

Neue Themen


Zurück
Oben