Try to embed the felix jar inside of your bundle instead of importing
it from the outside i.e.,
Bundle-Activator: voc.vh.HostApplication
Bundle-Classpath: .,felix.jar
Bundle-Name: Virtual OSGi Containers
Bundle-SymbolicName: VOC
(this assumes that you put the felix jar inside the root of your bundle)
Then it should work.
Alternatively, you could make the voc.vh.iface available via the
normal classpath and the system bundle package list.
regards,
Karl
On Wed, Apr 9, 2008 at 9:19 PM, Miguel Matos <[EMAIL PROTECTED]> wrote:
> Hello!
> I am trying to embed Felix as a bundle. This is related to some issues
> that I want to solve but the problem is not here.
>
> I followed the wiki about how to embed Felix and everything gone fine, i.e,
> my app is running the way I want.
>
> However as I say I need to embed Felix as an OSGi bundle but I'm having the
> (classical) classloading problems.
>
>
> Basicaly I built a simple bundle in whose Activator I do all the necessary
> steps to embed Felix as in the tutorial.
> To this point everything goes fine.
> But I also want to export some services through the system bundle. To do
> this I register a simple service within the embed Felix Activator, and
> adjust the manifest
> accordingly.
>
> However when I try to start a bundle in the embed Felix (not in the "main
> instance") that uses the exported service it fails with a
> classnotfoundexception as show below:
> (Lines with #### are comments made by me right now)
>
> -> vgw start file:/tmp/hw.jar
> Hello World...
> ####Checking for all services
> BundleSystem Bundle
> Property objectClass
> org.osgi.service.startlevel.StartLevel
> Property service.id -> 1
> BundleSystem Bundle
> Property objectClass
> org.osgi.service.packageadmin.PackageAdmin
> Property service.id -> 2
> BundleSystem Bundle
> Property myey -> myalue
> ####My service is here!!!!
> Property objectClass voc.vh.iface.Lookup
> Property service.id -> 3
> #### This is the class of the service object retrieved with
> BundleContext#getService(...)
> O is [EMAIL PROTECTED]
> #### This are the interfaces implemented by the above object
> EC isClazz: voc.vh.iface.Lookup
> #### This is the result of invoking a method into the obtained object
> through reflection
> Hello BLA BLA
> #### And those are the exceptions obtained when I try to cast the obtained
> object to its interface
> org.osgi.framework.BundleException: Activator start error.
> at org.apache.felix.framework.Felix._startBundle(Felix.java:1652)
> at org.apache.felix.framework.Felix.startBundle(Felix.java:1542)
> at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:369)
> at
> voc.vh.HostApplication.startVirtualizedApplication(HostApplication.java:120)
> at voc.vh.HostApplication.execute(HostApplication.java:171)
> at
> org.apache.felix.shell.impl.Activator$ShellServiceImpl.executeCommand(Activator.java:276)
> at
> org.apache.felix.shell.tui.Activator$ShellTuiRunnable.run(Activator.java:180)
> at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.NoClassDefFoundError: voc/vh/iface/Lookup
> at voc.tt.HelloWorld.start(HelloWorld.java:81)
> at
> org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:591)
> at org.apache.felix.framework.Felix._startBundle(Felix.java:1608)
> ... 7 more
> Caused by: java.lang.ClassNotFoundException: voc.vh.iface.Lookup
> at
> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:200)
> at
> org.apache.felix.framework.searchpolicy.R4SearchPolicy.findClass(R4SearchPolicy.java:45)
> at
> org.apache.felix.framework.searchpolicy.ContentClassLoader.loadClass(ContentClassLoader.java:109)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
> ... 10 more
> Caused by: java.lang.ClassNotFoundException: voc.vh.iface.Lookup
> at
> org.apache.felix.framework.searchpolicy.R4Wire.getClass(R4Wire.java:109)
> at
> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.searchImports(R4SearchPolicyCore.java:507)
> at
> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClassOrResource(R4SearchPolicyCore.java:468)
> at
> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:187)
> ... 14 more
> Bundle Started
>
>
>
> Attached are the relevant code:
>
> Lookup: is the service interface
> LookupImpl: is the implementation of that interface
> HostActivator: is the activator for the hosting bundle
> HostApplication: is the main class of the bundle that embeds felix
> manifest_hostBundle: is the manifest for the above bundle
> manifest_helloWorld: is the manifest for the client bundle of the service
> HelloWorld: is the only class of the bundle that is launched inside the
> embed Felix
>
> Please note that if the HostApplication is run as a normal java application
> everything goes fine.
> Sorry if the information is overwhelming, any help will be appreciated.
>
> mm
>
> package voc.vh;
>
> import java.util.Dictionary;
>
> import org.osgi.framework.BundleActivator;
> import org.osgi.framework.BundleContext;
>
> import voc.vh.iface.Lookup;
>
>
> public class HostActivator implements BundleActivator
> {
> private BundleContext m_context = null;
>
> public void start(BundleContext context)
> {
> m_context = context;
>
> Dictionary d = new java.util.Hashtable();
> d.put("myey", "myalue");
> context.registerService(Lookup.class.getName(),
> new LookupImpl(), d);
> }
>
> public void stop(BundleContext context)
> {
> m_context = null;
> }
> }
> package voc.vh;
>
> import java.util.ArrayList;
> import java.util.List;
> import java.util.Map;
>
> import org.apache.felix.framework.Felix;
> import org.apache.felix.framework.cache.BundleCache;
> import org.apache.felix.framework.util.FelixConstants;
> import org.apache.felix.framework.util.StringMap;
> import org.osgi.framework.Bundle;
> import org.osgi.framework.BundleActivator;
> import org.osgi.framework.BundleContext;
> import org.osgi.framework.BundleException;
> import org.osgi.framework.Constants;
> import org.osgi.framework.ServiceRegistration;
>
> public class HostApplication implements BundleActivator {
>
> private Felix m_felix = null;
>
> private ServiceRegistration serviceRegistration = null;
>
> public static void main(String[] args) {
> HostApplication ha = new HostApplication();
>
> ha.startVirtualHost();
> ha.startVirtualizedApplication("file:/tmp/hw.jar");
>
> // ha.shutdownApplication();
> }
>
> public void startVirtualHost() {
> // Create a case-insensitive configuration property map.j
> Map configMap = new StringMap(false);
> // Configure the Felix instance to be embedded.
> configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP,
> "true");
> // Add core OSGi packages to be exported from the class path
> // via the system bundle.
> configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
> "org.osgi.framework; version=1.3.0,"
> +
> "org.osgi.service.packageadmin; version=1.2.0,"
> +
> "org.osgi.service.startlevel; version=1.0.0,"
> + "org.osgi.service.url;
> version=1.0.0,"
> + "voc.vh.iface,"
> +
> "org.apache.felix.shell.impl");
> // Explicitly specify the directory to use for caching
> bundles.
> configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP,
> "/tmp/felixCache");
>
> try {
> // Create host activator;
> HostActivator ha = new HostActivator();
>
> List list = new ArrayList();
> list.add(ha);
>
> // Now create an instance of the framework with
> // our configuration properties and activator.
> m_felix = new Felix(configMap, list);
>
> // Now start Felix instance.
> m_felix.start();
>
> } catch (Exception ex) {
> System.err.println("Could not create framework: " +
> ex);
> ex.printStackTrace();
> }
>
> System.out.println("Felix Started");
> }
>
> public void startVirtualizedApplication(String path) {
>
> try {
> BundleContext bc = m_felix.getBundleContext();
> Bundle b = bc.installBundle(path);
>
> b.start();
>
> } catch (BundleException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
>
> System.out.println("Bundle Started");
> }
>
> public void shutdownApplication() {
> // Shut down the felix framework when stopping the
> // host application.
> try {
> m_felix.stop();
> } catch (BundleException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
>
> // /// BundleActivator Implementation
> public void start(BundleContext bc) throws Exception {
>
> startVirtualHost();
> startVirtualizedApplication("file:/tmp/hw.jar");
> }
>
> public void stop(BundleContext bc) throws Exception {
> bc = null;
> serviceRegistration.unregister();
> System.out.println("Host stopped");
> }
> }
> package voc.vh;
>
> import voc.vh.iface.Lookup;
>
> public class LookupImpl implements Lookup {
>
> public void hello(String name) {
> System.out.println("Hello " + name + "!");
> }
> }
>
> package voc.vh.iface;
>
> public interface Lookup {
>
> public void hello(String name);
> }
>
> Bundle-Activator: voc.tt.HelloWorld
> Import-Package: org.osgi.framework,voc.vh.iface
> Bundle-Name: Hello World
> Bundle-SymbolicName: helloworld
>
> Bundle-Activator: voc.vh.HostApplication
> Import-Package:
> org.osgi.framework,org.apache.felix.shell,org.apache.felix.framework,org.apache.felix.framework.util,org.apache.felix.shell.impl.Util,org.osgi.util.tracker
> Bundle-Name: Virtual OSGi Containers
> Bundle-SymbolicName: VOC
>
> package voc.tt;
>
> import org.osgi.framework.BundleActivator;
> import org.osgi.framework.BundleContext;
> import org.osgi.framework.ServiceReference;
>
> import voc.vh.iface.Lookup;
>
> public class HelloWorld implements BundleActivator{
>
> public void start(BundleContext bc) throws Exception {
> System.out.println("Hello World...");
>
>
>
> //
> for (ServiceReference sr :
> bc.getAllServiceReferences(null, null)) {
>
>
> System.out.println("Bundle" +
> sr.getBundle().getSymbolicName());
> for (String p : sr.getPropertyKeys()) {
> if (p.equalsIgnoreCase("objectClass")) {
> System.out.print("\tProperty " + p
> );
>
> for (String x : (String[])
> sr.getProperty(p)) {
>
> System.out.println("\t\t"+x);
> }
> }
> else
> System.out.println("\tProperty " + p
> + " -> " + sr.getProperty(p));
> }
>
> }
> ServiceReference bla =
> bc.getServiceReference("voc.vh.iface.Lookup");
> Object o = bc.getService(bla);
>
> System.out.println("O is " + o);
>
> System.out.print("EC is" );
> for ( Class clazz : o.getClass().getInterfaces()){
> System.out.println("Clazz: " + clazz.getName());
> }
>
> o.getClass().getDeclaredMethod("hello", new
> Class[]{String.class}).invoke(o, new String[]{"BLA BLA"});
> // (o.getClass().getDeclaredMethods()[0).invoke("hello", "BLA
> BLA"));
>
> Lookup l = (Lookup) o;
> // (Lookup) o;
> // Lookup look = (Lookup)
> bc.getService(bc.getServiceReference("voc.vh.iface.Lookup"));
> //
> // l.hello("BLA BLA");
> }
>
> public void stop(BundleContext arg0) throws Exception {
> System.out.println("Bye World...");
> }
>
> public void hello(String name) {
> System.out.println("Hello " + name + "!");
> }
> }
>
--
Karl Pauls
[EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]