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