No, you didn't get my point. The fact the datasource is there or not doesn't matter at runtime if it doesn't provide the capability.
Let me explain. Your bundles history-stuff contains in META-INF/MANIFEST: Require-Capability: osgi.service;effective:=active;objectClass="javax.sql.DataSource";filter=.... When you install with bundle:install, this header is simply ignored. BUT, when you install using features service, the feature resolver check all bundles requirements/capabilities. So, the feature resolver is looking for: - a bundle containing Provide-Capability header in MANIFEST matching the requirement - a feature containing <capability/> matching the requirement It's nothing related to runtime (the actual bundle installed and running), only the MANIFEST cap/req matter; So, in your case, you can just provide the capability in the feature providing the datasource. It's exactly what you can see in the karaf-jpa-example: https://github.com/apache/karaf/blob/main/examples/karaf-jpa-example/karaf-jpa-example-features/src/main/feature/feature.xml#L28 Regards JB On Wed, Mar 9, 2022 at 5:30 PM Bengt Rodehav <[email protected]> wrote: > But the filetransfoerhistoryjta datasource is there. I've verified that. > And if I install the bundle directly instead of going through the feature > it works fine and connects to the datasource. Why can it not be found when > I go through the feature but when I install the bundle directly? > > /Bengt > > Den ons 9 mars 2022 kl 17:10 skrev Jean-Baptiste Onofré <[email protected]>: > >> I don't think anything changed on the resolver, maybe you updated >> maven-bundle-plugin or bnd to create your bundle, and now it includes the >> requirement (whereas your bundles didn't contain requirement in MANIFEST >> before). >> >> On Wed, Mar 9, 2022 at 4:59 PM Bengt Rodehav <[email protected]> wrote: >> >>> I didn't have any problems with this using Karaf 4.3.3. Do you know if >>> something has changed? I'm using Karaf 4.3.6 now. >>> >>> /Bengt >>> >>> Den ons 9 mars 2022 kl 16:46 skrev Bengt Rodehav <[email protected]>: >>> >>>> Is there any way to stop the feature installer from using the resolver? >>>> >>>> /Bengt >>>> >>>> Den ons 9 mars 2022 kl 16:37 skrev Bengt Rodehav <[email protected]>: >>>> >>>>> Unfortunately I didn't get any extra information. I got the same as >>>>> before which is: >>>>> >>>>> 2022-03-09T16:26:02,494 | INFO | pipe-feature:install -v >>>>> connect-filetransfer-history-db | FeaturesServiceImpl | 18 - >>>>> org.apache.karaf.features.core - 4.3.6 | Adding features: >>>>> connect-filetransfer-history-db/[3.1.0.SNAPSHOT,3.1.0.SNAPSHOT] >>>>> 2022-03-09T16:26:02,901 | ERROR | Karaf local console user karaf | >>>>> ShellUtil | 70 - org.apache.karaf.shell.core - >>>>> 4.3.6 >>>>> | Exception caught while executing command >>>>> org.apache.felix.resolver.reason.ReasonException: Unable to resolve >>>>> root: missing requirement [root] osgi.identity; >>>>> osgi.identity=connect-filetransfer-history-db; type=karaf.feature; >>>>> version="[3.1.0.SNAPSHOT,3.1.0.SNAPSHOT]"; >>>>> filter:="(&(osgi.identity=connect-filetransfer-history-db)(type=karaf.feature)(version>=3.1.0.SNAPSHOT)(version<=3.1.0.SNAPSHOT))" >>>>> [caused by: Unable to resolve >>>>> connect-filetransfer-history-db/3.1.0.SNAPSHOT: missing requirement >>>>> [connect-filetransfer-history-db/3.1.0.SNAPSHOT] osgi.identity; >>>>> osgi.identity=se.digia.connect.services.filetransfer.history-domain; >>>>> type=osgi.bundle; version="[3.1.0.SNAPSHOT,3.1.0.SNAPSHOT]"; >>>>> resolution:=mandatory [caused by: Unable to resolve >>>>> se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT: >>>>> missing requirement >>>>> [se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT] >>>>> osgi.service; objectClass=javax.sql.DataSource; effective:=active; >>>>> filter:="(osgi.jndi.service.name=jdbc/filetransferhistoryjta)"]] >>>>> at >>>>> org.apache.felix.resolver.Candidates$MissingRequirementError.toException(Candidates.java:1341) >>>>> ~[?:?] >>>>> at >>>>> org.apache.felix.resolver.ResolverImpl.doResolve(ResolverImpl.java:433) >>>>> ~[?:?] >>>>> at >>>>> org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:420) >>>>> ~[?:?] >>>>> at >>>>> org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:374) >>>>> ~[?:?] >>>>> at >>>>> org.apache.karaf.features.internal.region.SubsystemResolver.resolve(SubsystemResolver.java:257) >>>>> ~[?:?] >>>>> at >>>>> org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:399) >>>>> ~[?:?] >>>>> at >>>>> org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1069) >>>>> ~[?:?] >>>>> at >>>>> org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:1004) >>>>> ~[?:?] >>>>> at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?] >>>>> at >>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) >>>>> ~[?:?] >>>>> at >>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) >>>>> ~[?:?] >>>>> at java.lang.Thread.run(Thread.java:833) [?:?] >>>>> Caused by: org.apache.felix.resolver.reason.ReasonException: Unable to >>>>> resolve connect-filetransfer-history-db/3.1.0.SNAPSHOT: missing >>>>> requirement >>>>> [connect-filetransfer-history-db/3.1.0.SNAPSHOT] osgi.identity; >>>>> osgi.identity=se.digia.connect.services.filetransfer.history-domain; >>>>> type=osgi.bundle; version="[3.1.0.SNAPSHOT,3.1.0.SNAPSHOT]"; >>>>> resolution:=mandatory [caused by: Unable to resolve >>>>> se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT: >>>>> missing requirement >>>>> [se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT] >>>>> osgi.service; objectClass=javax.sql.DataSource; effective:=active; >>>>> filter:="(osgi.jndi.service.name=jdbc/filetransferhistoryjta)"] >>>>> at >>>>> org.apache.felix.resolver.Candidates$MissingRequirementError.toException(Candidates.java:1341) >>>>> ~[?:?] >>>>> ... 12 more >>>>> Caused by: org.apache.felix.resolver.reason.ReasonException: Unable to >>>>> resolve >>>>> se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT: >>>>> missing requirement >>>>> [se.digia.connect.services.filetransfer.history-domain/3.1.0.SNAPSHOT] >>>>> osgi.service; objectClass=javax.sql.DataSource; effective:=active; >>>>> filter:="(osgi.jndi.service.name=jdbc/filetransferhistoryjta)" >>>>> at >>>>> org.apache.felix.resolver.Candidates$MissingRequirementError.toException(Candidates.java:1341) >>>>> ~[?:?] >>>>> at >>>>> org.apache.felix.resolver.Candidates$MissingRequirementError.toException(Candidates.java:1341) >>>>> ~[?:?] >>>>> ... 12 more >>>>> >>>>> I tried the "--store" option which gave me a quite large file that I >>>>> unfortunately did not understand fully. Not sure if it helps any. >>>>> >>>>> /Bengt >>>>> >>>>> Den ons 9 mars 2022 kl 16:22 skrev Bengt Rodehav <[email protected]>: >>>>> >>>>>> OK - thanks. Will try that. >>>>>> >>>>>> /Bengt >>>>>> >>>>>> Den ons 9 mars 2022 kl 16:16 skrev Jean-Baptiste Onofré < >>>>>> [email protected]>: >>>>>> >>>>>>> Hi >>>>>>> >>>>>>> The main difference is that feature used the resolver to optimize >>>>>>> the installation. Bundle installation doesn’t use the feature resolver. >>>>>>> >>>>>>> You can use feature:install -v to get resolver output and you will >>>>>>> probably see the chain found by the resolver. >>>>>>> >>>>>>> Regards >>>>>>> JB >>>>>>> >>>>>>> Le mer. 9 mars 2022 à 15:22, Bengt Rodehav <[email protected]> a >>>>>>> écrit : >>>>>>> >>>>>>>> I have a very strange problem (in Karaf 4.3.6). I use JPA and have >>>>>>>> a bundle containing a persistence.xml in which a datasource is >>>>>>>> referenced: >>>>>>>> >>>>>>>> <jta-data-source>osgi:service/javax.sql.DataSource/( >>>>>>>> osgi.jndi.service.name >>>>>>>> =jdbc/filetransferhistoryjta)</jta-data-source> >>>>>>>> >>>>>>>> If the datasource is not available when I install this bundle then >>>>>>>> I will get an error complaining that the datasource is not present. The >>>>>>>> strange thing is that it seems to be dependent on how I install this >>>>>>>> bundle >>>>>>>> - directly installing the bundle or doing it via a feature. In the >>>>>>>> first >>>>>>>> case it works but in the latter it doesn't. >>>>>>>> >>>>>>>> If I first install all the prerequisites I need and then issue the >>>>>>>> following command in the Karaf shell: >>>>>>>> >>>>>>>> bundle:install -s >>>>>>>> mvn:se.digia.connect.services.filetransfer/history-domain/3.1-SNAPSHOT >>>>>>>> >>>>>>>> Then it works fine. It even works if I remove the "-s" and start >>>>>>>> the bundle afterwards instead. >>>>>>>> >>>>>>>> However, if I use the following feature: >>>>>>>> >>>>>>>> <feature name="connect-filetransfer-history-db" >>>>>>>> version="3.1-SNAPSHOT"> >>>>>>>> >>>>>>>> <bundle>mvn:se.digia.connect.services.filetransfer/history-domain/3.1-SNAPSHOT</bundle> >>>>>>>> </feature> >>>>>>>> >>>>>>>> And then issue the following command: >>>>>>>> >>>>>>>> feature:install connect-filetransfer-history-db >>>>>>>> >>>>>>>> Then the datasource cannot be found and the install fails. This >>>>>>>> happens consistently. I am using Pax-Jdbc for exposing the datasource >>>>>>>> via >>>>>>>> JNDI. >>>>>>>> >>>>>>>> First I thought that there might be a timing problem and that you >>>>>>>> have to wait a while to get the datasource published but it doesn't >>>>>>>> seem to >>>>>>>> have anything to do with that at all. I can wait 5 minutes after >>>>>>>> installing >>>>>>>> the datasource. I also check with the command "jndi:names" that it is >>>>>>>> published. But it still doesn't work using a feature. >>>>>>>> >>>>>>>> Can anyone tell me what is being done differently when I use a >>>>>>>> feature compared to when I just install the bundle directly? There is >>>>>>>> apparently some kind of difference. >>>>>>>> >>>>>>>> /Bengt >>>>>>>> >>>>>>>>
