You are loading the class from two different class loaders, thus they are not compatible with each other.

You cannot "import" packages from bundles when you are on the outside of the framework, such as you are trying to do by moving your client to the outside.

The only way you can get this to work is to put the packages you want to share on the outside too and then export them into the framework via the system bundle (see org.osgi.framework.system.packages.extra config property).

Any classes you want to share between bundles and outside code must be on the class path and shared into the framework...we have a whole chapter on launching and embedding frameworks in the OSGi in Action book if you want a more detailed explanation...

-> richard

p.s. Technically, you could also use reflection in the client instead of using the classes directly, but I assume you don't want to do that.

On 2/12/13 13:56 , Imóveis Nacionais wrote:
I have 2 bundles, one that supplys a service and the other that calls the
service. When both are installed and started in felix framework everything
works.

Now, I would like to drop/forget the client bundle and create a console app
to launch felix, install server bundle and call the service.



Here the structure of server bundle (MyBundleServer):

Src

    com.mycompany.mybundleserver package

       Activator.java

       upnpImpl.java

    com.mycompany.mybundleserver.serviceinterface

       upnp.java   -> the interface



For the console client, I created a java application, I added the
org.apache.felix.framework-2.0.0.jar and wrote the following code in main()
function


  FrameworkFactory frameworkFactory =
ServiceLoader.load(FrameworkFactory.class).iterator().next();

Map<String, String> config = new HashMap<String, String>();

Framework framework = frameworkFactory.newFramework(config);

framework.start();


BundleContext context = framework.getBundleContext();

Bundle y=
context.installBundle("file:/C:/OSGi/felix-framework-4.0.3/MyBundleServer-1.0-SNAPSHOT.jar"
); //the server bundle

y.start();



ServiceReference sr  =  context.getServiceReference(upnp.class.getName());

  if(sr != null)

  {

           upnp x = (upnp)context.getService(sr); //interface type

           if(x != null)

           {

                 int n=x.GetNumber();

                 context.ungetService(sr);

           }

    }



When running, line

upnp x = (upnp)context.getService(sr);

generates:

Exception in thread "main" java.lang.ClassCastException:
com.mycompany.mybundleserver.upnpImpl cannot be cast to
com.mycompany.mybundleserver.serviceinterface.upnp

at mystandaloneclient.MyStandAloneClient.main(MyStandAloneClient.java:65)



So, if upnpImpl implements upnp interface and upnp is the interface why can
not JVM cast this stuff?

Thanks a lot



Alex



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to