Hi

    I tried to use ivy dual resolver and ivy shared repository together to
handle complex dependency management in BIG product.

   In my solution, I will have a ivy shared repository to share product
releases in a shared file system such as nfs. And a dual resolver
will be used to limit the 3pp dependencies : only the approved dependencies
(with specific version) can be use in this product.

   So My first gradle repositories settings comes :

def String ivyRepositoryDir =  "${projectDir}/ivyRepository"
def String nexusRoot = "http://127.0.0.1:8081/nexus";;
def String ivySharedRepositoryDir =  "${projectDir}/ivySharedRepository"

repositories {

    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'ivy-shared-repo'
        addIvyPattern
"${ivySharedRepositoryDir}/[organisation]/[module]/[revision]/[type]s/[artifact].[ext]"
        addArtifactPattern
"${ivySharedRepositoryDir}/[organisation]/[module]/[revision]/[type]s/[artifact].[ext]"
        checkmodified = true
    }

    add(new org.apache.ivy.plugins.resolver.DualResolver()) {
     name = "ivyDualResolver"
     descriptor = "required"

     add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
         name = 'ivy-repo'
         addIvyPattern
"${ivyRepositoryDir}/[organisation]/[module]/ivy-[revision].xml"
         checkmodified = true
     }

     add(new org.apache.ivy.plugins.resolver.IBiblioResolver()) {
         name = 'jar-repo'
         root = "${nexusRoot}/content/groups/public/"
         m2compatible = true
     }
    }
}

And I want to use it to handle two dependencies:

dependencies {
compile group: 'commons-lang', name: 'commons-lang', version: '2.4'
compile group: 'net.sourcesky', name: 'skybuilder', version: '0.2.0',
configuration:'master'
}

1. commons-lang is a 3pp dependency, I add its ivy.xml in ivyRepository and
use a local nexus as proxy of maven central repository.
2. net.sourcesky.skybuilder is a part of our product and I want to publish
to / get from our shared ivy repository, now I used a FileSystemResolver for
it.

I think this is a perfect solution. I like it and I had run this solution
well by using ant + ivy for a long time. And now I want to move it to
gradle.

But in strange error occurs: a NullPointException throws in dependencies
donwload!  I checked the NullPointException and found by ivy DualResolver :

    public DownloadReport download(Artifact[] artifacts, DownloadOptions
options) {
        return artifactResolver.download(artifacts, options);
    }

    The "artifactResolver" properties is NULL !  I add some debug script to
build.gradle to confirm this:


println "ivyDualResolver = " +  repositories.getByName('ivyDualResolver')
println "ivyDualResolver.name = " +
 repositories.getByName('ivyDualResolver').name
println "ivyResolver = " +
 repositories.getByName('ivyDualResolver').ivyResolver
println "artifactResolver = " +
 repositories.getByName('ivyDualResolver').artifactResolver

    The ivyResolver and artifactResolver in ivy DualResolver are both null.

    It means that these script doesn't work :

    add(new org.apache.ivy.plugins.resolver.DualResolver()) {
     add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {...}
     add(new org.apache.ivy.plugins.resolver.IBiblioResolver()) {...}
    }

    I have to change the script of creating dual repository to java type
script :

def FileSystemResolver ivyResolver = new FileSystemResolver()
ivyResolver.name = '3pp-ivy-repo'
ivyResolver.addIvyPattern("${ivyRepositoryDir}/[organisation]/[module]/ivy-[revision].xml")
ivyResolver.checkmodified = true

def IBiblioResolver jarResolver = new IBiblioResolver()
jarResolver.name = '3pp-jar-repo'
jarResolver.root = "${nexusRoot}/content/groups/public/"
jarResolver.m2compatible = true

def DualResolver dualResolver = new DualResolver()
dualResolver.name = "ivyDualResolver"
dualResolver.descriptor = "required"
dualResolver.add(ivyResolver)
dualResolver.add(jarResolver)

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) { ... }
    add(dualResolver)
}

And then the ivy dual script works!

I'm a new people for gradle and groovy, I don't know what happens, can
somebody help me ?

Sky Ao

Reply via email to