The bnd plugin from the maven bundle plugin used to do that:

https://github.com/apache/felix/blob/trunk/tools/maven-bundle-plugin/src/main/resources/org/apache/felix/bundleplugin/scr.xsl
I think it's now disabled by default and the bnd one is used.

Maybe an upgrade of the maven bundle plugin would fix the problem ?


2016-10-12 19:41 GMT+02:00 David Jencks <david.a.jen...@gmail.com>:

> What is generating the Require-Capabiility header?  The target filter
> isn’t supposed to be there on either Provide- or Require-Capability since
> it can generally be overridden by configuration.  AFAICT the bnd DS
> processing doesn’t add the target filter to the Require-Capability header.
>
> david jencks
>
> > On Oct 12, 2016, at 4:30 AM, Sergiy Shyrkov <my.public.mail...@gmail.com>
> wrote:
> >
> > Hello guys,
> >
> > we are migrating from Karaf 4.0.5 to 4.0.7 and facing a small issue with
> the feature resolution.
> > I know that in Karaf 4.0.6 the enforcement of service capabilities when
> feature is installed became effective.
> > But in our case we use a filter when consuming the service.
> >
> > In Java code using DS it looks as follows (we are consuming a service,
> exposed by org.apache.karaf.cellar.bundle):
> >
> >    @Reference(service = Synchronizer.class, target = "(resource=bundle)")
> >    protected void bindCellarBundleSynchronizer(Synchronizer
> cellarBundleSynchronizer) {
> >        this.cellarBundleSynchronizer = cellarBundleSynchronizer;
> >    }
> >
> > and it results in the following header in MANIFEST.MF:
> >
> >    Require-Capability: osgi.service;effective:=
> active;filter:="(&objectClass=org.apache.karaf.cellar.core.
> Synchronizer)(resource=bundle))"
> >
> >
> > Note that the filter apart from standard objectClass contains also the
> "(resource=bundle)" clause.
> > And this is the culprit in our case.
> > Because of that clause our feature fails the installation now:
> >
> > org.osgi.service.resolver.ResolutionException: Unable to resolve root:
> missing requirement [root] osgi.identity; osgi.identity=dx-clustering;
> type=karaf.feature; version="[7.2.0.0-SNAPSHOT,7.2.0.0-SNAPSHOT]";
> filter:="(&(osgi.identity=dx-clustering)(type=karaf.
> feature)(version>=7.2.0.0-SNAPSHOT)(version<=7.2.0.0-SNAPSHOT))" [caused
> by: Unable to resolve dx-clustering/7.2.0.0-SNAPSHOT: missing requirement
> [dx-clustering/7.2.0.0-SNAPSHOT] osgi.identity; 
> osgi.identity=org.jahia.bundles.clustering;
> type=osgi.bundle; version="[7.2.0.0-SNAPSHOT,7.2.0.0-SNAPSHOT]";
> resolution:=mandatory [caused by: Unable to resolve
> org.jahia.bundles.clustering/7.2.0.0-SNAPSHOT: missing requirement
> [org.jahia.bundles.clustering/7.2.0.0-SNAPSHOT] osgi.service;
> effective:=active; filter:="(&(objectClass=org.apache.karaf.cellar.core.
> Synchronizer)(resource=bundle))"]]
> >       at org.apache.felix.resolver.ResolutionError.toException(
> ResolutionError.java:42)
> >       at org.apache.felix.resolver.ResolverImpl.resolve(
> ResolverImpl.java:235)
> >       at org.apache.felix.resolver.ResolverImpl.resolve(
> ResolverImpl.java:158)
> >       at org.apache.karaf.features.internal.region.
> SubsystemResolver.resolve(SubsystemResolver.java:216)
> >       at org.apache.karaf.features.internal.service.Deployer.
> deploy(Deployer.java:263)
> >       at org.apache.karaf.features.internal.service.FeaturesServiceImpl.
> doProvision(FeaturesServiceImpl.java:1176)
> >       at org.apache.karaf.features.internal.service.
> FeaturesServiceImpl$1.call(FeaturesServiceImpl.java:1074)
> >       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> >       at java.util.concurrent.ThreadPoolExecutor.runWorker(
> ThreadPoolExecutor.java:1142)
> >       at java.util.concurrent.ThreadPoolExecutor$Worker.run(
> ThreadPoolExecutor.java:617)
> >       at java.lang.Thread.run(Thread.java:745)
> >
> >
> >
> > The resolution issue is only a feature level.
> > When I am installing/starting the bundle alone I do not have the issue.
> >
> > I was able to workaround the issue by overriding the cellar-bundle
> feature in our descriptor and providing explicit capability for that
> service with the resource=bundle property, i.e.:
> >
> >
> >    <feature name="dx-cellar-bundle" ...>
> >        ...
> >        <capability>
> >            osgi.service;effective:=active;objectClass=org.apache.
> karaf.cellar.core.Synchronizer;resource=bundle
> >        </capability>
> >    </feature>
> >
> >
> > But I would like to ask for help and advice about the proper handling,
> please.
> > Are we doing something wrong? Is there a better way to let feature
> resolver work with service filters more accurately?
> >
> > Thank you in advance!
> >
> > Kind regards
> > Sergiy
> >
> >
> > --
> > Sergiy Shyrkov
> > Software Architect
> > Jahia Solutions Group SA
> > http://www.jahia.com
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Red Hat, Open Source Integration

Email: gno...@redhat.com
Web: http://fusesource.com
Blog: http://gnodet.blogspot.com/

Reply via email to