On 30/08/2013, at 7:38 AM, Adam Murdoch <adam.murd...@gradleware.com> wrote:
> > On 30/08/2013, at 6:39 AM, johnrengelman <john.r.engel...@gmail.com> wrote: > >> I've gone back to the drawing board and came up with a simpler solution where >> in ExternalResourceResolver >> I check for any artifact existing and then only mark the artifact as >> resolved by that repository if one is found. > > We want to behave differently in this case for the Maven cache compared to > arbitrary repository. It's expected in the Maven cache for an artefact to be > missing, but it means a badly formed module everywhere else. > > I think we want something like this: > > 1. If we find a pom and no artifact in the Maven cache > * If we can find the module in some other repository, silently ignore > the stuff in the Maven cache and use the module from the other repository. > * If we cannot find the module in some other repository, fail with an > 'artefact missing' exception. > 2. If we find a pom and no artefact in some repository, fail with an > 'artefact missing' exception. > > Or, perhaps it might be nicer in #2 if we warn instead of fail when we can > find the module in another repository. > > Regardless of exactly what we do here, it's not the resolvers responsibility > to decide whether to fail or continue the search. Instead, it should just > communicate what it found, so that `UserResolverChain`, which is coordinating > the search, can take care of stopping or continuing or whatever. To do this, > we might add some new states to > `BuildableModuleVersionMetaDataResolveResult`, so that the resolver can let > the search algorithm know that it found a badly formed or partial module. > > >> >> The problem I'm having is handling POM dependencies. There doesn't seem to >> be enough information passed in the Module Descriptor to know if the >> dependency that is currently being resolved has POM packaging. >> >> I tried one work around by looking at the ResolvedArtifact for the module >> descriptor and if it ends in ".pom" using the PomReader to parse it and get >> the packaging. That worked, but then I ran into issues with some integration >> tests where the the artifact packaging and classifiers didn't match >> (ArtifactDependenciesIntegrationTests.canUseClassifiersCombinedWithArtifactWithNonStandardPackaging). >> It appears that it was relying on the fact that the artifacts aren't checked >> before attempting resolution. > > I would change the `ModuleDescriptorParser` implementations to return a > `MutableModuleVersionMetaData` instead of `ModuleDescriptor` (this is the > plan anyway). I ended up making this change. So now we can add stuff to ModuleVersionMetaData to describe something about whether we expect the module to have artefacts or not. -- Adam Murdoch Gradle Co-founder http://www.gradle.org VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting http://www.gradleware.com Join us at the Gradle eXchange 2013, Oct 28th in London, UK: http://skillsmatter.com/event/java-jee/gradle-exchange-2013