# OSGi Bundle Problem - ClassNotFound



## seb (11. Aug 2009)

Hallo zusammen,

ich habe ein Problem mit dem Einbinden eines Bundles in ein OSGi Framework. Als Zielsetzung habe ich, dass mein Bundle, welches ein Servlet ist, über den
Pfad "webserver/ajax/sipro" erreichbar ist. Lokal in Eclipse funktioniert das auch soweit. 
Mein Problem ist, dass wenn ich das Bundle am OSGi Framework des Open-Xchange Servers anmelde es leider gar nicht erst gestartet wird, sondern eine ClassNotFound Exception wirft.


```
BundleException: The activator de.sipro.testservlet2.SiProActivator for bundle de.sipro.testservlet2 is invalid
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:141)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:970)
	at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
	at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
Caused by: java.lang.ClassNotFoundException: de.sipro.testservlet2.SiProActivator
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:434)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357)
	at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:289)
	at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:134)
	... 10 more
Root exception:
java.lang.ClassNotFoundException: de.sipro.testservlet2.SiProActivator
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:434)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357)
	at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:289)
	at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:134)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:970)
	at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
	at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
```

Klingt ja zunächst mal nach einem einfachen Fehler aber ich habe den Classpath im Manifestfile eigentlich gesetzt und dazu ist der Activator ja mit im Bundle.
Sollte also rein theoretisch vom Bundle ClassLoader gefunden werden ...
Hat einer eine Idee wo der Fehler sonst noch herkommen könnte? Ein zweites Testbundle ohne Activator wird interessanterweise im Framework als aktiv markiert 
... ist aber leider auch nicht erreichbar. Wobei das vermutlich eher ein OX spezifisches Problem ist.

[edit] Das Problem mit der ClassNotFound Exception existiert nicht mehr. Man muss im Bundle Manifestfile unter dem Bundle Classpath außer dem '.' auch noch die Subfolder angeben.


----------



## Noctarius (11. Aug 2009)

Klingt nach Problemen im Export- bzw Import Package. Kommt diese Klasse aus dem selben Bundle oder aus einem anderen?


----------



## seb (11. Aug 2009)

Noctarius hat gesagt.:


> Klingt nach Problemen im Export- bzw Import Package. Kommt diese Klasse aus dem selben Bundle oder aus einem anderen?



Das Problem war, dass die Klasse in einem Unterverzeichnis des Bundles liegt und dieses Unterverzeichnis nicht im Bundle-Classpath Header aufgeführt war. Ich hatte vermutet es reicht der '.' um das komplette Bundle inklusive Unterverzeichnisse in den Classpath zu schreiben.
Das aktuelle Problem ist jetzt wie ich mein Servlet am Open-Xchange Server registriere damit ich per Browser zugreifen kann. Ist eben eher ein OX Problem aber vielleicht kennt sich ja hier jemand damit aus. Aktuelle browserausgabe ist folgendes:



> No servlet bound to path/alias: ajax/sipro


----------



## Noctarius (11. Aug 2009)

Im schlimmsten Fall im OSGi Bundle Activator und dann per Programm das Mapping erstellen.


----------



## seb (11. Aug 2009)

Nach einem tieferen Blick in den OX Sourcecode habe ich die Lösung gefunden. Ich nutze jetzt zum registrieren eine OX interne Klasse und wichtig ist dann noch, dass das eigene Bundle nach den OX Bundles gestartet wird.


----------

