Interestingly this works fine when running from Bndtools with Felix.

If I try the same with Equinox for projects created with PDE I get a 
NullPointerException. IIRC Private-Package is something special to Bnd. Is that 
correct? I wonder if that exception is caused by some PDE flaws or if it is an 
issue in Equinox Oxygen. In both cases Apache Felix SCR 2.0 is used. (in Oxygen 
2.0.8 and in Bndtools 2.0.2)

org.osgi.framework.ServiceException: Exception in 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService()
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:222)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:111)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:45)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:508)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:461)
       at 
org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:624)
       at 
org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:72)
       at 
org.apache.felix.scr.impl.inject.FieldHandler$ReferenceMethodImpl.getServiceObject(FieldHandler.java:985)
       at 
org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2201)
       at 
org.apache.felix.scr.impl.manager.DependencyManager$MultipleStaticReluctantCustomizer.prebind(DependencyManager.java:699)
       at 
org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1520)
       at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1006)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:859)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:212)
       at java.security.AccessController.doPrivileged(Native Method)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:210)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:111)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:45)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:508)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:461)
       at 
org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:624)
       at 
org.apache.felix.gogo.runtime.CommandProxy.getTarget(CommandProxy.java:50)
       at 
org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:72)
       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
       at 
org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
       at 
org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
       at org.apache.felix.gogo.shell.Console.run(Console.java:62)
       at org.apache.felix.gogo.shell.Shell.console(Shell.java:203)
       at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:128)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
       at 
org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
       at 
org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
       at 
org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
       at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
       at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
       at 
org.apache.felix.scr.impl.inject.FieldHandler.validateField(FieldHandler.java:279)
       at 
org.apache.felix.scr.impl.inject.FieldHandler.access$500(FieldHandler.java:51)
       at 
org.apache.felix.scr.impl.inject.FieldHandler$NotResolved.resolve(FieldHandler.java:839)
       at 
org.apache.felix.scr.impl.inject.FieldHandler$NotResolved.fieldExists(FieldHandler.java:864)
       at 
org.apache.felix.scr.impl.inject.FieldHandler.fieldExists(FieldHandler.java:918)
       at 
org.apache.felix.scr.impl.inject.FieldHandler$3.init(FieldHandler.java:1018)
       at 
org.apache.felix.scr.impl.manager.DependencyManager.invokeInitMethod(DependencyManager.java:1657)
       at 
org.apache.felix.scr.impl.manager.DependencyManager.open(DependencyManager.java:1533)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:261)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)
       at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:212)
       at java.security.AccessController.doPrivileged(Native Method)
       at 
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:210)
       ... 46 more

Mit freundlichen Grüßen / Best regards

Dirk Fauth

Automotive Service Solutions, ESI application (AA-AS/EIS2-EU)
Robert Bosch GmbH | Postfach 11 29 | 73201 Plochingen | GERMANY | 
www.bosch.com<http://www.bosch.com>
Tel. +49(7153)666-1155 | dirk.fa...@de.bosch.com<mailto:dirk.fa...@de.bosch.com>

Sitz: Stuttgart, Registergericht: Amtsgericht Stuttgart, HRB 14000;
Aufsichtsratsvorsitzender: Franz Fehrenbach; Geschäftsführung: Dr. Volkmar 
Denner,
Prof. Dr. Stefan Asenkerschbaumer, Dr. Rolf Bulander, Dr. Stefan Hartung, Dr. 
Markus Heyn, Dr. Dirk Hoheisel,
Christoph Kübel, Uwe Raschke, Peter Tyroller


Von: osgi-dev-boun...@mail.osgi.org [mailto:osgi-dev-boun...@mail.osgi.org] Im 
Auftrag von Peter Kriens
Gesendet: Mittwoch, 26. April 2017 09:14
An: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
Betreff: Re: [osgi-dev] handling optional/dynamic imports in DS

I used to import the package optional and then provide it as an internal 
Private-Package. The import has priority but the internal package is used when 
the import fails to resolve. Since you’re then always wired to a package you 
can handle dependencies on the place they should be handled: services.

This keeps everybody happy internally for very little cost. I’ve included a 
bndtools/enRoute example.

Kind regards,

            Peter Kriens


————————————————— bnd.bnd
Private-Package: \
                org.osgi.service.cm,\
                com.foo.provider

Import-Package: \
                org.osgi.service.cm;resolution:=optional,\
                *

-buildpath: \
                osgi.enroute.base.api
-runrequires: \
                osgi.identity;filter:='(osgi.identity=com.foo.provider)',\
                
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.runtime)',\
                
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\
                
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)'
-runbundles: \
                com.foo.provider;version=snapshot,\
                org.apache.felix.log;version='[1.0.1,1.0.2)',\
                org.apache.felix.scr;version='[2.0.2,2.0.3)',\
                org.apache.felix.gogo.runtime,\
                org.apache.felix.gogo.shell;version=0.16

————————————————— com.foo.provider.Optional
@Component
public class Optional
{
   @Reference(cardinality=ReferenceCardinality.OPTIONAL)
   ConfigurationAdmin admin;

   @Activate
   void activate() {
      System.out.println("activate " + admin);
   }
}

On 25 Apr 2017, at 23:10, Raymond Auge 
<raymond.a...@liferay.com<mailto:raymond.a...@liferay.com>> wrote:

I'm wondering if there is a reasonable model for handling optional or dynamic 
package imports in DS.
While optionality at the package level is not an ideal model, sometimes it 
can't be avoided.

I'd like to know if others have come across a "reasonable" way to model this in 
DS.

Sincerely,
--
Raymond Augé<http://www.liferay.com/web/raymond.auge/profile> (@rotty3000)
Senior Software Architect Liferay, Inc.<http://www.liferay.com/> (@Liferay)
Board Member & EEG Co-Chair, OSGi Alliance<http://osgi.org/> (@OSGiAlliance)
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org<mailto:osgi-dev@mail.osgi.org>
https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to