> Each time I read the ChainResolver I am bit confused by the "return first" > condition, which doesn't return. I am not sure here what should be the code > path.
Yeah...according to the documentation, once the module is found in a given resolver in the chain resolvers that haven't yet been used should be skipped altogether. The code doesn't seem to be written that way; it seems to use all of the resolvers regardless of returnFirst (in addition to seemingly returning the module found last, not first). I feel like I must be missing something here. Am I? > Just a hint: what happens if you remove from your ivysettings the > defaultConflictManager ? I just removed the defaultConflictManager from my ivysettings and went through the clean->resolve before building and publishing->build and publish->resolve again process, and the result is the same; after the publish and re-resolve the workspace projects are replaced in the Ivy classpath container by the artifacts in the repository. Isn't latest-revision the default when the attribute is omitted anyway? Thanks, Matt Hurne On Tue, May 15, 2012 at 3:02 PM, Nicolas Lalevée <nicolas.lale...@hibnet.org> wrote: > > Le 15 mai 2012 à 20:51, Matt Hurne a écrit : > >> So I've attached a debugger and have been stepping through the >> resolves. As far as I can see, there is a ChainResolver that includes >> both the workspace resolver and then our default resolver (which is >> itself a chain resolver). The workspace resolver finds the module in >> the workspace and returns it to the ChainResolver, and then our >> resolver also finds the module (in the repository) and returns it to >> the ChainResolver. The ChainResolver appears to discard the module >> resolved by the workspace resolver in favor of the module returned by >> our resolver instead. >> >> Here's the relevant snippet from >> org.apache.ivy.plugins.resolver.ChainResolver.java starting with line >> 102 (also recall this is Ivy 2.2.0): >> >> ResolvedModuleRevision previouslyResolved = mr; >> data.setCurrentResolvedModuleRevision(previouslyResolved); >> mr = resolver.getDependency(dd, data); >> if (mr != previouslyResolved && isReturnFirst()) { >> mr = forcedRevision(mr); >> } >> >> >> When this code is dealing with our resolver, the first line sets >> previouslyResolved to the module we want (the module that represents >> the project in the workspace). The third line sets mr to the module >> in the repository (the one we don't want). In this case, mr does not >> equal previouslyResolved and isReturnFirst() is true. The body of the >> if statement is executed, which just sets mr to the forcedRevision() >> version of itself. Is that right? Shouldn't the body of the if >> statement be: >> >> mr = forcedRevision(previouslyResolved); ??? >> >> or perhaps just: >> >> mr = previouslyResolved; ??? >> >> >> I don't fully grok the purpose of forcedRevision(), so maybe that's >> what is throwing me off? > > Each time I read the ChainResolver I am bit confused by the "return first" > condition, which doesn't return. I am not sure here what should be the code > path. > > Just a hint: what happens if you remove from your ivysettings the > defaultConflictManager ? > > Nicolas > > >> >> Thanks, >> Matt Hurne >> >> >> On Tue, May 15, 2012 at 1:40 PM, Matt Hurne <m...@thehurnes.com> wrote: >>>> Ok, that makes some sense. After adding resolveMode="dynamic" to my >>>> <settings>, I do see that the <dependency> elements of the delivered >>>> ivy files include a resolved rev attribute as well as a revConstraint >>>> attribute, such as: >>>> >>>> <dependency org="com.acme" name="thingamajig" rev="20120515131106" >>>> revConstraint="latest.integration" conf="default->default"/> >>> >>> Not that it helps me much, but I should clarify that the <dependency> >>> elements in the delivered Ivy files look the same regardless of the >>> resolve mode configured; the revConstraint is included with a value of >>> "latest.integration" either way. So it's my understanding that the >>> resolve mode doesn't have a direct effect on the delivered Ivy files, >>> but rather which of the revision-related attributes in those delivered >>> Ivy files is used in future resolves. >>> >>> Matt Hurne >>> >>> >>> On Tue, May 15, 2012 at 1:26 PM, Matt Hurne <m...@thehurnes.com> wrote: >>>>> Have you tried to set it on the "settings" element in the ivysettings ? >>>> >>>> I hadn't before, but just did: >>>> >>>> <settings defaultResolver="default-chain" defaultResolveMode="dynamic" >>>> defaultConflictManager="latest-revision" >>>> circularDependencyStrategy="error" /> >>>> >>>> Unfortunately this did not solve the problem for me. IvyDE was able >>>> to resolve projects in the workspace prior to any of them being built >>>> and published to the local repository, but after they were built and >>>> published and I did a "resolve all" in Eclipse, the project references >>>> were replaced with the published artifacts. So this worked better >>>> than when I added a <modules> section to my ivysettings to set the >>>> resolve mode, but no better than if I just left the resolve mode as >>>> the default across the board. >>>> >>>> >>>>> When you publish your artifacts into your local repository, Ivy does a >>>>> "deliver" of the ivy.xml of your project. If there is any range version >>>>> in your dependencies, Ivy fix them as the one resolved during the build. >>>>> So the next time a resolve happens and that module is found in you >>>>> repository, Ivy will resolved the previously-resolved revision, the fixed >>>>> one, not the original range version. Setting the resolve mode to dynamic >>>>> change this behavior; it will use the range rather than the resolved >>>>> version. Look at your ivy.xml in the local repository, you'll see some >>>>> extra attributes in your dependency, if you have any range version. >>>> >>>> Ok, that makes some sense. After adding resolveMode="dynamic" to my >>>> <settings>, I do see that the <dependency> elements of the delivered >>>> ivy files include a resolved rev attribute as well as a revConstraint >>>> attribute, such as: >>>> >>>> <dependency org="com.acme" name="thingamajig" rev="20120515131106" >>>> revConstraint="latest.integration" conf="default->default"/> >>>> >>>> Note that we are not specifying revisions in our modules' ivy files at >>>> the moment, so Ivy appears to set the revision to the publication data >>>> and time when delivering each Ivy file. For example: >>>> >>>> <info organisation="com.acme" module="thingy" >>>> revision="20120515131237" status="integration" >>>> publication="20120515131237"> >>>> >>>> Not sure where to go from here. Do you have any additional thoughts? >>>> Thanks for your time thus far! >>>> >>>> Matt H >>>> >>>> >>>> On Tue, May 15, 2012 at 5:01 AM, Nicolas Lalevée >>>> <nicolas.lale...@hibnet.org> wrote: >>>>> >>>>> Le 14 mai 2012 à 22:38, Matt Hurne a écrit : >>>>> >>>>>>> Maybe there are some transitive dependency which confuse the Workspace >>>>>>> resolver. See at the end of the doc: >>>>>>> http://ant.apache.org/ivy/ivyde/history/latest-milestone/cpc/workspace.html >>>>>>> >>>>>>>> In some setup, if you want to mix some resolver of your own and the >>>>>>>> workspace resolver, and still want the transitive dependencies work >>>>>>>> nicely between them, you may want to turn the resolve mode to dynamic: >>>>>>>> • see the defaultResolveMode attribute of settings in the >>>>>>>> ivysettings. >>>>>>>> • see the resolveMode attribute of module in the ivysettings. >>>>>> >>>>>> Yes, I had seen that before sending my original note to the list since >>>>>> it did seem relevant. I added a <modules> element to the >>>>>> ivysettings.xml like: >>>>>> >>>>>> <modules> >>>>>> <module organisation="com.company" name="*" resolveMode="dynamic"/> >>>>>> </modules> >>>>>> >>>>>> After doing so, IvyDE seemed unable to resolve a given project's >>>>>> dependencies at all, including projects in the workspace, even with an >>>>>> empty local repository. I'm not sure what to make of that; >>>>> >>>>> I don't either. Have you tried to set it on the "settings" element in the >>>>> ivysettings ? >>>>> >>>>>> to be >>>>>> honest, I don't really understand what difference it should have made. >>>>>> Any chance you can elaborate? >>>>> >>>>> When you publish your artifacts into your local repository, Ivy does a >>>>> "deliver" of the ivy.xml of your project. If there is any range version >>>>> in your dependencies, Ivy fix them as the one resolved during the build. >>>>> So the next time a resolve happens and that module is found in you >>>>> repository, Ivy will resolved the previously-resolved revision, the fixed >>>>> one, not the original range version. Setting the resolve mode to dynamic >>>>> change this behavior; it will use the range rather than the resolved >>>>> version. Look at your ivy.xml in the local repository, you'll see some >>>>> extra attributes in your dependency, if you have any range version. >>>>> >>>>> Nicolas >>>>> >>>>>> >>>>>> Thanks, >>>>>> Matt Hurne >>>>>> >>>>>> >>>>>> On Mon, May 14, 2012 at 4:28 PM, Nicolas Lalevée >>>>>> <nicolas.lale...@hibnet.org> wrote: >>>>>>> Maybe there are some transitive dependency which confuse the Workspace >>>>>>> resolver. See at the end of the doc: >>>>>>> http://ant.apache.org/ivy/ivyde/history/latest-milestone/cpc/workspace.html >>>>>>> >>>>>>>> In some setup, if you want to mix some resolver of your own and the >>>>>>>> workspace resolver, and still want the transitive dependencies work >>>>>>>> nicely between them, you may want to turn the resolve mode to dynamic: >>>>>>>> • see the defaultResolveMode attribute of settings in the >>>>>>>> ivysettings. >>>>>>>> • see the resolveMode attribute of module in the ivysettings. >>>>>>> >>>>>>> Nicolas >>>>>>> >>>>>>> Le 14 mai 2012 à 20:36, Matt Hurne a écrit : >>>>>>> >>>>>>>> On Mon, May 14, 2012 at 2:31 PM, Matt Hurne <m...@thehurnes.com> wrote: >>>>>>>>> We are using Ivy to manage the dependencies of our projects on each >>>>>>>>> other, and we're planning to use IvyDE as well. One of the resolvers >>>>>>>>> we have in our Ivy configuration is used to publish our build >>>>>>>>> artifacts to a local repository (with status "integration") so that >>>>>>>>> they are available when building the projects that depend on them. In >>>>>>>>> a clean environment, this repository is initially empty. If the local >>>>>>>>> repository is empty and we configure IvyDE to resolve dependencies in >>>>>>>>> the workspace, the projects do end up in the Ivy classpath containers >>>>>>>>> of the projects that depend on them as expected. However, if we then >>>>>>>>> build and publish the projects to the local repository and then >>>>>>>>> perform a new resolve-all in Eclipse/IvyDE, the projects are removed >>>>>>>>> from the Ivy classpath containers and the artifacts in the local >>>>>>>>> repository take their places. >>>>>>>>> >>>>>>>>> Is this behavior expected/correct? Is there a way to ensure that >>>>>>>>> IvyDE will always put workspace projects in the classpath container >>>>>>>>> rather than artifacts with identical module revision IDs that exist in >>>>>>>>> one of our configured repositories? >>>>>>>>> >>>>>>>>> If I were dealing with this type of scenario outside of Eclipse/IvyDE, >>>>>>>>> I would look at putting the resolvers into a chain and using the >>>>>>>>> "returnFirst" attribute to enforce a specific order. That's >>>>>>>>> effectively what I'm looking to do with the workspace resolver. Is >>>>>>>>> that possible? >>>>>>>> >>>>>>>> >>>>>>>> I should have mentioned the following details about our environment: >>>>>>>> >>>>>>>> Windows XP 32bit >>>>>>>> Eclipse 3.7 Indigo >>>>>>>> IvyDE 2.2.0.beta1 with Ivy 2.2.0 (we had some other show-stopping >>>>>>>> issues when using IvyDE with Ivy 2.3.0, so we installed Ivy 2.2.0 >>>>>>>> explicitly) >>>>>>>> >>>>>>>> In addition, when building projects using Ant we're using Ivy 2.2.0. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Matt Hurne >>>>>>> >>>>> >