我使用供应商库从Xml生成Java源代码。此源xml导入存在于某个jar文件中的其他xml。我知道这个Jar文件的坐标。供应商库是我的黑盒子,但我知道它使用ThreadContextClassLoader从jar加载导入。但是,它失败了,因为它无法从类路径/ jar中找到导入的xmls。
实现这个目标的方式是什么?
// 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();
}
}
答案 0 :(得分:1)
CodeGenerator
是否有setClassloader(Classloader)
方法?您可以使用Configuration
和URLClassloader
。例如:
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")
}
}
查看类似的概念here
答案 1 :(得分:1)
从我的另一个回答中我们已经确定没有为CodeGenerator
设置类加载器的选项。因此,唯一的选择是让jar与xml文件由与CodeGenerator`相同的类加载器加载。
选项1:将jar添加到buildscript { ... }
块
buildscript {
dependencies {
classpath 'com.group:jar-with-xmls:1.0'
}
}
选项2:通过buildSrc/build.gradle
dependencies {
compile 'com.vendor:code-generator:1.0'
runtime 'com.group:jar-with-xmls:1.0'
}
答案 2 :(得分:0)
jar文件是zip存档。您可以使用java.util.zip类将它们作为zip文件打开。在gradle中,您可能希望使用ziptree进行提取,如下所述: http://mrhaki.blogspot.jp/2012/06/gradle-goodness-unpacking-archive.html