I would like to thank you for your help. After adding my services and the event admin service to the boot delegation property, my environment was working fine. :-)
BR, Markus 2009/7/14 Richard S. Hall <[email protected]> > I believe the issue is that you are exporting from the system bundle, plus > your bundle contains the same packages as you are exporting from the system > bundle. > > So, you have to make sure only one copy is being used. I think your bundle > was only exporting osgiServices.vehiclePushService. This means your bundle > will always get its own copy, since it doesn't import the package too. If > you import it too, then it would likely get wired to the system bundle's > export, since resolved packages are preferred and the system bundle will be > resolved first. > > As I mention in my other message, one way around this is in your embedded > mode, add the shared packages to the boot delegation property to get them to > always load from the class path. Note, if you are using trunk you will need > to set a new property to boot delegate to the app class loader > (org.osgi.framework.bundle.parent=app). > > -> richard > > On 7/14/09 3:55 PM, Markus Michel wrote: > >> Some weeks ago I tried to use this instructions to get my embedded felix >> instance working, but it didn't worked. Afterwards some guy on >> stackover.comgave me the hint to put the whole package to the system >> >> packages path. If I >> strictly follow the wiki entry the line within my intialization block >> should >> look like: >> >> configMap.put(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, >> "osgiServices.vehiclePushService; version=1.0.0"); >> >> <path to the service includings it's implementation within the host app> >> >> But if the entry only contains this value, I'm getting the class loading >> error again. >> >> Sorry, but I think that I have some problems in understanding the >> explanations on that site completely. As far as I understood it all >> packages >> within this property should be executed by the some class loader, which is >> used for the system bundle and all other bundles. Therefore there >> shouldn't >> occur any class loading problems, when the bundle tries to access the >> service. Am I wrong? Maybe you can give me a more detailed explanation ... >> >> Unfortunately the felix environment has to run in the embedded mode within >> my program, because I want to run and control several osgi instances at >> once. I hope that we will be able to solve my problem ... >> >> BR, >> >> Markus >> >> 2009/7/14 Richard S. Hall<[email protected]> >> >> >> >>> You should read: >>> >>> >>> >>> http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html >>> >>> It gives some pointers to running with an embedded framework instance. In >>> short, your app and all bundles should go through the class path (i.e., >>> system bundle) for any packages shared between the host app and the >>> bundles. >>> >>> To make sure this happens, you could actually put the host/bundle shared >>> packages on the boot class path property to make sure everyone gets the >>> same >>> ones, no matter how the bundles are wired internally. This at least has >>> the >>> benefit that your bundles will work properly when not used in the >>> embedded >>> situation. >>> >>> I knew there was more than what met the eye here. :-) >>> >>> Embedded mode is alluring to a lot of people coming to OSGi, but there >>> are >>> lots of hidden issues with it, so better to avoid it if you can. >>> >>> -> richard >>> >>> >>> On 7/14/09 1:53 PM, Markus Michel wrote: >>> >>> >>> >>>> You are right. If I remove that line, I'm able to load the event admin >>>> service. But the problem is that I cannot remove it, because other parts >>>> of >>>> my program depends on that information: My "vehiclePushService" is >>>> mostly >>>> implemented (and started) within the host application but some parts are >>>> implemented within the bundle. If I do not add "vehiclePushService" to >>>> that >>>> line, I'm getting the class loading exception >>>> >>>> java.lang.ClassCastException: >>>> osgiServices.vehiclePushService.VehiclePushServiceImpl cannot be cast to >>>> osgiServices.vehiclePushService.VehiclePushService >>>> >>>> , when the bundle tries to use the service. Maybe I have to add the >>>> event >>>> admin service to that line, too?!? >>>> >>>> BR, >>>> >>>> Markus >>>> >>>> ----- >>>> >>>> Markus, >>>> >>>> Yes, I believe your embedded configuration is the issue. Why are you >>>> doing >>>> this: >>>> >>>> configMap.put(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, >>>> "osgiServices.vehicleCommunicationService; >>>> osgiServices.vehiclePushService; >>>> vehiclePushService; vehicleCommunicationService"); >>>> >>>> ? >>>> >>>> It seems like this is incorrect, since your bundle contains these >>>> packages. >>>> Try removing this and see what happens. >>>> >>>> Hi Richard! >>>> >>>> Here's the bundle which tries to use the felix event admin service. If >>>> you >>>> wish I can provide you the sources of the bundle, too. >>>> >>>> If you want to use the bundle, you have to load the following bundles: >>>> >>>> org.apache.felix.shell-1.2.0.jar >>>> org.apache.felix.shell.tui-1.2.0.jar >>>> org.apache.felix.eventadmin-1.0.0.jar >>>> VehiclePushService_1.0.0.jar >>>> >>>> Some minutes ago I noticed that the bundle can be loaded successfully if >>>> you >>>> run it directly from a command-line-based felix instance. The error only >>>> occures if you try to run it >>>> as an embedded version. Very confusing. >>>> >>>> Maybe there's something wrong with the configuration of my felix >>>> instance: >>>> >>>> private void initialize() >>>> { >>>> // create new map for storing the felix configuration properties >>>> configMap = new HashMap<String, Object>(); >>>> >>>> // export the host provided service interface package >>>> configMap.put(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, >>>> "osgiServices.vehicleCommunicationService; >>>> osgiServices.vehiclePushService; >>>> vehiclePushService; vehicleCommunicationService"); >>>> >>>> // add autoactivator that specifies all services that shall be >>>> loaded together with the system bundle >>>> List<Object> list = new ArrayList<Object>(); >>>> list.add(new AutoActivator(configMap)); >>>> >>>> // create service activators >>>> vehicleCommunicationServiceActivator = new >>>> VehicleCommunicationServiceActivator(connection); >>>> list.add(vehicleCommunicationServiceActivator); >>>> >>>> vehiclePushServiceActivator = new VehiclePushServiceActivator(); >>>> list.add(vehiclePushServiceActivator); >>>> >>>> // add service activators to felix instance >>>> configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, >>>> list); >>>> >>>> // set felix-cache folder >>>> configMap.put("org.osgi.framework.storage", "felix-cache/" + >>>> id); >>>> } >>>> >>>> >>>> BR, >>>> >>>> Markus >>>> >>>> ------- >>>> >>>> 2009/7/14 Richard S. Hall<[email protected]> >>>> >>>> >>>> >>>> >>>> >>>>> I don't see anything that immediately looks incorrect. If you want to >>>>> send >>>>> me your bundle (privately) with the steps to reproduce, I will look at >>>>> it. >>>>> >>>>> -> richard >>>>> >>>>> >>>>> On 7/14/09 4:20 AM, Markus Michel wrote: >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>> Hi Richard! >>>>>> >>>>>> Of course I can provide more informations. The manifest file of the >>>>>> bundle >>>>>> looks like this: >>>>>> >>>>>> Manifest-Version: 1.0 >>>>>> Bundle-ManifestVersion: 2 >>>>>> Bundle-Name: VehiclePushService >>>>>> Bundle-SymbolicName: VehiclePushService >>>>>> Bundle-Version: 1.0.0 >>>>>> Bundle-Activator: vehiclePushService.Activator >>>>>> Import-Package: org.osgi.framework;version="1.3.0", >>>>>> org.osgi.service.event;version="1.1.0", >>>>>> vehiclePushService >>>>>> Bundle-RequiredExecutionEnvironment: JavaSE-1.6 >>>>>> Bundle-ClassPath: ., >>>>>> vehiclePushService.jar >>>>>> Export-Package: >>>>>> osgiServices.vehiclePushService, >>>>>> vehiclePushService >>>>>> >>>>>> The content of the bundle looks as follows: >>>>>> >>>>>> META-INF/ >>>>>> META-INF/MANIFEST.MF >>>>>> hostApplication/ >>>>>> hostApplication/vehiclePushService/ >>>>>> osgiFramework/ >>>>>> osgiFramework/vehiclePushService/ >>>>>> vehiclePushService/ >>>>>> META-INF/.classpath >>>>>> META-INF/.project >>>>>> vehiclePushService.jar >>>>>> vehiclePushService/Activator.class >>>>>> vehiclePushService/OSGiPosition2D.class >>>>>> vehiclePushService/OSGiVehicle.class >>>>>> vehiclePushService/OSGiVehiclePushService.class >>>>>> vehiclePushService/VehicleListener.class >>>>>> vehiclePushService/VehiclePushEvent.class >>>>>> vehiclePushService/VehiclePushServiceHandler.class >>>>>> >>>>>> Because inside the plug-in dependencies org.eclipse.services is >>>>>> referenced >>>>>> I >>>>>> think that the bundles currently uses the equinox implementation of >>>>>> the >>>>>> eventadmin service. Later on I will try to load the equinox eventadmin >>>>>> service instead >>>>>> of the felix eventadmin service. Maybe it's then possible to start my >>>>>> bundle >>>>>> ... >>>>>> >>>>>> BR, >>>>>> >>>>>> Markus >>>>>> >>>>>> >>>>>> 2009/7/13 Richard S. Hall<[email protected]> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> On 7/13/09 2:47 PM, Markus Michel wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> Hi there! >>>>>>>> >>>>>>>> Today I wanted to add the eventadmin service to my OSGi environment. >>>>>>>> Therefore I extended the import block of my bundle, which is created >>>>>>>> within >>>>>>>> an eclipse equinox project, with org.osgi.service.event. After >>>>>>>> loading >>>>>>>> the >>>>>>>> service I tried to access it by running the following command: >>>>>>>> >>>>>>>> // get service reference to event admin service >>>>>>>> serviceReference = >>>>>>>> bundleContext.getServiceReference(EventAdmin.class.getName()); >>>>>>>> >>>>>>>> // check if service reference is valid >>>>>>>> if (serviceReference != null) >>>>>>>> { >>>>>>>> eventAdmin = (EventAdmin) >>>>>>>> bundleContext.getService(serviceReference); >>>>>>>> } >>>>>>>> >>>>>>>> But inside the if-loop I'm getting an error: >>>>>>>> >>>>>>>> java.lang.ClassCastException: >>>>>>>> >>>>>>>> org.apache.felix.eventadmin.impl.security.EventAdminSecurityDecorator >>>>>>>> cannot >>>>>>>> be cast to org.osgi.service.event.EventAdmin >>>>>>>> >>>>>>>> I'm a little bit confused now, because I thought that the Apache >>>>>>>> Felix >>>>>>>> framework is fully compatible to the OSGi specifications?!? >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> While the Felix framework isn't yet 100% compliant, it is very close >>>>>>> and >>>>>>> getting closer every release. >>>>>>> >>>>>>> Isn't it >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> possible to mix equinox components (my bundle) with felix components >>>>>>>> (the >>>>>>>> eventadmin service)? >>>>>>>> >>>>>>>> Does anybody has an idea how I can solve my problem? >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> Such a scenario should work, but you didn't provide enough >>>>>>> information >>>>>>> to >>>>>>> say why it isn't. Perhaps you could show us your bundle's manifest >>>>>>> file >>>>>>> as >>>>>>> well as a "jar tf" of the bundle. >>>>>>> >>>>>>> -> richard >>>>>>> >>>>>>> BR, >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> Markus >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: [email protected] >>>>>>> For additional commands, e-mail: [email protected] >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> >>> >> >> >

