If you do feature:repo-add first with all repositories, sure it works. The resolver doesn't install automatically required feature based on req/cap: it validates the requirement is matched, so you have to install the feature provided the cap. It allows you to "decoupled" the features (without req/cap, you would need to define inner features) and it also works at bundle/feature level.
In the verify goal, it's what you do: you define all features repositories, and then, you add features with <features/> so the cap/req will match. What do you try to achieve ? Install a feature with req and then automatically install features provided the cap ? Regards JB On 20/06/2019 18:41, Ryan Moquin wrote: > In the second example, I'm referring to the repository with the feature > that has the capability though. I'm also referencing it from the test1 > feature with a dependency=true attribute. If I verify the features with > the karaf-maven-plugin, I don't get any validation errors. I only do > when I install from inside Karaf. > > If I use the separate feature repository like above, test1 will fail to > install even with the reference to feature test2, unless I install > feature test2 first, "feature:install test2". I guess that's a little > why I am confused. I'm also confused why the verify doesn't fail. It's > almost like the verify is able to resolve the requirement and > capability, but it can't at runtime. > > Ryan > > > On Thu, Jun 20, 2019 at 10:50 AM Jean-Baptiste Onofré <[email protected] > <mailto:[email protected]>> wrote: > > Hi Ryan, > > it's what I thought: the cap/req are splitted in two repositories, where > each one doesn't know each other ;) > > Here you have different options: > > 1. You can load all features repository in your Karaf distribution (in > etc/org.apache.karaf.features.cfg) > 2. You can refer one repository in another one using <repository/> tag > 3. You can use Cave feature gateway to gather all features in one. > > Regards > JB > > On 20/06/2019 14:57, Ryan Moquin wrote: > > Sure, I figured I would test with a simple example so I can make sure > > I'm not doing anything stupid (I NEEEEEVER do anything stupid). If I > > created a features xml like this: > > > > ---------------------------------------------------------- > > <?xml version="1.0" encoding="UTF-8"?> > > <features name="${project.artifactId}-${project.version}" > > xmlns="http://karaf.apache.org/xmlns/features/v1.5.0" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > > > xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0 > > http://karaf.apache.org/xmlns/features/v1.5.0"> > > > > <feature name="test1" version="${project.version}"> > > <requirement>test.env;filter:="(env=np)"</requirement> > > </feature> > > > > <feature name="test2" version="${project.version}"> > > <feature dependency="true">test3</feature> > > </feature> > > > > <feature name="test3" version="${project.version}"> > > <capability>test.env;env=np</capability> > > </feature> > > </features> > > --------------------------------------------- > > > > It works as expected. If I do this: > > > > > -------------------------------------------------------------------------- > > <?xml version="1.0" encoding="UTF-8"?> > > <features name="${project.artifactId}-${project.version}" > > xmlns="http://karaf.apache.org/xmlns/features/v1.5.0" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > > > xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0 > > http://karaf.apache.org/xmlns/features/v1.5.0"> > > > > > > > > <repository>mvn:${project.groupId}/test23/${project.version}/xml/features</repository> > > > > <feature name="test1" version="${project.version}"> > > <requirement>test.env;filter:="(env=np)"</requirement> > > </feature> > > </features> > > > -------------------------------------------------------------------------- > > and > > > -------------------------------------------------------------------------- > > <?xml version="1.0" encoding="UTF-8"?> > > <features name="${project.artifactId}-${project.version}" > > xmlns="http://karaf.apache.org/xmlns/features/v1.5.0" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > > > xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0 > > http://karaf.apache.org/xmlns/features/v1.5.0"> > > > > <feature name="test2" version="${project.version}"> > > <feature dependency="true">test3</feature> > > </feature> > > > > <feature name="test3" version="${project.version}"> > > <capability>test.env;env=np</capability> > > </feature> > > </features> > > > -------------------------------------------------------------------------- > > > > Then the requirement can't be resolved. I can however install the > test2 > > feature so I know the test23 repo was added. What is curious to me > > though, is why if the above doesn't work, why I don't get a > failure when > > I verify the features for the above. I figured by referencing test2 > > (which lives in the other features.xml in the second case), it was > > discover that it provides the required capability. > > > > In reading the Karaf docs again (which I appreciate because they are > > quite good and I know docs are time consuming and a pain to write :)) > > I'm wondering if I have to install all the features and bundles in the > > other features xml but not auto-start them (I think I saw an > option for > > that)? > > > > Thanks! > > Ryan > > > > On Thu, Jun 20, 2019 at 1:17 AM Jean-Baptiste Onofré > <[email protected] <mailto:[email protected]> > > <mailto:[email protected] <mailto:[email protected]>>> wrote: > > > > Hi Ryan, > > > > Do you mean you are using resources repository (define in > > etc/org.apache.karaf.features.cfg) ? > > > > A features repository can also contains capability and > requirements. > > > > To be able to find the req/cap, the resolver needs to know the > cap/req. > > If they are splitted in different repositories, then you have > first to > > "load" the repositories to be visible by the resolver. Else > the resolver > > won't know "where" the cap is provided. > > > > Cave can help in two ways: > > 1. the features gateway is able to gather several features > repositories > > in a meta-global-one. > > 2. Cave can serve as resources repositories backend > > > > Can you share your test case in order for me to take a look ? > > > > Regards > > JB > > > > On 19/06/2019 23:18, Ryan Moquin wrote: > > > Hi JB, > > > > > > I decided to try the req/cap again. The reason it didn't > work for me > > > before apparently is because a capability satisfying a > requirement > > isn't > > > detected by the resolver if they are in different feature > repositories > > > (which is the same as a feature XML I believe). I tried to > > reference a > > > feature as a dependency in a different repository but it > wouldn't work > > > unless I had it in the same repository. > > > > > > I'm not sure if that's by design or if something like Cave > would be > > > needed for that scenario. Otherwise I need to rethink how I > > handle the > > > requirement and capabilities. I am trying to keep separate > feature > > > repositories because if I aggregate, then it takes longer to > > create the > > > updated aggregate feature xml. > > > > > > Ryan > > > > > > On Sat, Jun 15, 2019, 12:01 PM Jean-Baptiste Onofré > > <[email protected] <mailto:[email protected]> > <mailto:[email protected] <mailto:[email protected]>> > > > <mailto:[email protected] <mailto:[email protected]> > <mailto:[email protected] <mailto:[email protected]>>>> wrote: > > > > > > Hi Ryan, > > > > > > I will provide a more complete answer (I don't have time > right > > now), but > > > you can take a look on the way we use cap/req in Pax Web > (for > > the HTTP > > > provider capability). > > > > > > Basically, the cap/req are global in the feature resolver, > > considering > > > the req/cap at feature level, but also at bundle level. > > > > > > Regards > > > JB > > > > > > On 15/06/2019 16:28, Ryan Moquin wrote: > > > > I apologize if this is a stupid question. I've been > trying to > > > understand > > > > how to leverage capabilities and requirements in a way > to allow > > > defining > > > > the provisioning of a system by specifying > requirements in a > > feature. > > > > > > > > I've read through the posts on the mailing list about it, > > the docs and > > > > the karaf features.xml but haven't found the information I > > am looking > > > > for. I also tried some experiments with a bundle > providing a > > > capability > > > > and a feature requiring it but it didn't seem to > work. I am > > wondering > > > > if I am just over thinking or over complicating it in > my head. > > > Here are > > > > the questions: > > > > > > > > 1. When a feature specifies a requirement, what is the > > "scope" of > > > > resolution used by the feature resolver? Meaning, does it > > only pick > > > > from features specified within that feature with > dependency=true > > > > specified? Or from any feature defined in the > features.xml > > and any > > > > feature repository defined that provides a satisfying > > capability? > > > > > > > > 2. Can you specify a requirement in a feature for a > requirement > > > > provided by a bundle? > > > > > > > > 3. If a bundle or feature provides a capability, but > you don't > > > specify > > > > you require it. Does it always get considered for > > installation if > > > it's > > > > in a feature that doesn't have dependency=true? > > > > > > > > Part of this is because I still can't understand when > to use > > > > dependency=true for a feature. I am primarily talking > about > > custom > > > > capabilities and requirements I make up myself for a > system > > to pull > > > > things in. > > > > > > > > Not sure if the above questions fully make sense, having a > > hard time > > > > articulating exactly what I am trying to figure out. > > > > > > > > Thanks for any help! > > > > > > > > Ryan > > > > > > -- > > > Jean-Baptiste Onofré > > > [email protected] <mailto:[email protected]> > <mailto:[email protected] <mailto:[email protected]>> > > <mailto:[email protected] <mailto:[email protected]> > <mailto:[email protected] <mailto:[email protected]>>> > > > http://blog.nanthrax.net > > > Talend - http://www.talend.com > > > > > > > -- > > Jean-Baptiste Onofré > > [email protected] <mailto:[email protected]> > <mailto:[email protected] <mailto:[email protected]>> > > http://blog.nanthrax.net > > Talend - http://www.talend.com > > > > -- > Jean-Baptiste Onofré > [email protected] <mailto:[email protected]> > http://blog.nanthrax.net > Talend - http://www.talend.com > -- Jean-Baptiste Onofré [email protected] http://blog.nanthrax.net Talend - http://www.talend.com
