Gradle 从 Jar 加载文件的任务
Gradle task to load files from Jar
我使用供应商库从 Xml 生成 Java 源。此源 xml 导入存在于某个 jar 文件中的其他 xml。我知道这个 Jar 文件的坐标。供应商库对我来说是一个黑盒子,但我知道它使用 ThreadContextClassLoader 从 jar 加载导入。但是,它失败了,因为它无法从 classpath/jars.
中找到导入的 xmls
完成此任务的 gradle 方法是什么?
// 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();
}
}
jar 文件是 zip 存档。您可以使用 java.util.zip 类 打开它们作为 zip 文件。在 gradle 中,您可能希望使用 ziptree 进行提取,如下所述:
http://mrhaki.blogspot.jp/2012/06/gradle-goodness-unpacking-archive.html
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")
}
}
看到类似的概念
根据我的其他回答,我们确定没有为 CodeGenerator
设置类加载器的选项。因此,唯一的选择是让带有 xml 文件的 jar 由与 CodeGenerator` 相同的类加载器加载。
选项 1:将 jar 添加到 buildscript { ... }
块中的构建脚本类路径
buildscript {
dependencies {
classpath 'com.group:jar-with-xmls:1.0'
}
}
选项 2:通过 buildSrc/build.gradle
将 jar 添加到构建脚本类路径
dependencies {
compile 'com.vendor:code-generator:1.0'
runtime 'com.group:jar-with-xmls:1.0'
}
我使用供应商库从 Xml 生成 Java 源。此源 xml 导入存在于某个 jar 文件中的其他 xml。我知道这个 Jar 文件的坐标。供应商库对我来说是一个黑盒子,但我知道它使用 ThreadContextClassLoader 从 jar 加载导入。但是,它失败了,因为它无法从 classpath/jars.
中找到导入的 xmls完成此任务的 gradle 方法是什么?
// 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();
}
}
jar 文件是 zip 存档。您可以使用 java.util.zip 类 打开它们作为 zip 文件。在 gradle 中,您可能希望使用 ziptree 进行提取,如下所述: http://mrhaki.blogspot.jp/2012/06/gradle-goodness-unpacking-archive.html
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")
}
}
看到类似的概念
根据我的其他回答,我们确定没有为 CodeGenerator
设置类加载器的选项。因此,唯一的选择是让带有 xml 文件的 jar 由与 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'
}