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 + "!");
        }
} 

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to