chauhraj
chauhraj

Reputation: 499

Gradle task to load files from Jar

I use vendor library to generate Java sources from an Xml. This source xml imports other xml which exists in some jar file. I know the coordinates of this Jar file. The vendor library is a blackbox to me but I know that it uses ThreadContextClassLoader to load the imports from a jar. However, it fails because it cannot find the imported xmls from the classpath/jars.

What is the gradle way of accomplishing this?

// body of gradle task
@TaskInput
void execute(IncrementalTaskInputs inputs) {
   inputs.outOfDate { changes ->
       // CodeGenerator is the vendor library
       CodeGenerator generator = new CodeGenerator();
       // call some setter methods to set the inputs.
       //
       generators.setXml(file("<path/to/the-file"))
       generator.generate();
   } 
}

Upvotes: 0

Views: 2146

Answers (3)

lance-java
lance-java

Reputation: 28016

From my other answer we have ascertained that there's no option to set the classloader for the CodeGenerator. So, the only option is to have the jar with the xml files loaded by the same classloader as the CodeGenerator`.

Option 1: Add the jar to the buildscript classpath in a buildscript { ... } block

buildscript {
    dependencies {
         classpath 'com.group:jar-with-xmls:1.0'
    }
}

Option 2: Add the jar to the buildscript classpath via buildSrc/build.gradle

dependencies {
    compile 'com.vendor:code-generator:1.0'
    runtime 'com.group:jar-with-xmls:1.0'
}

Upvotes: 1

lance-java
lance-java

Reputation: 28016

Does the CodeGenerator have a setClassloader(Classloader) method? You could likely use a Configuration and a URLClassloader. Eg:

configurations {
   codeGenerator
}
dependencies {
   codeGenerator 'foo:bar:1.0'
   codeGenerator 'baz:biff:2.0'
}
task generateCode {
    inputs.files configurations.codeGenerator
    outputs.dir "$buildDir/codeGenerator"
    doLast {
        URL[] urls = configurations.codeGenerator.files.collect { it.toUri().toUrl() }
        Classloader cl = new URLClassLoader(urls, null)
        CodeGenerator generator = new CodeGenerator()
        generator.setClassLoader(cl)
        ...
        generator.generateTo("$buildDir/codeGenerator")
    }
}

See a similar concept here

Upvotes: 1

tkruse
tkruse

Reputation: 10695

jar files are zip archives. You can open them as zipfiles using java.util.zip classes. In gradle, you might want to use ziptree to extract, as explained here: http://mrhaki.blogspot.jp/2012/06/gradle-goodness-unpacking-archive.html

Upvotes: 0

Related Questions