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
>>>>>>>>
>>>>>>>>

Reply via email to