从Jar加载文件的Gradle任务

从Jar加载文件的Gradle任务,gradle,gradle-task,Gradle,Gradle Task,我使用供应商库从Xml生成Java源代码。此源xml导入存在于某个jar文件中的其他xml。我知道这个Jar文件的坐标。供应商库对我来说是一个黑盒子,但我知道它使用ThreadContextClassLoader从jar加载导入。但是,它失败了,因为它无法从类路径/jars中找到导入的xml 实现这一目标的渐进方式是什么 // body of gradle task @TaskInput void execute(IncrementalTaskInputs inputs) { inputs

我使用供应商库从Xml生成Java源代码。此源xml导入存在于某个jar文件中的其他xml。我知道这个Jar文件的坐标。供应商库对我来说是一个黑盒子,但我知道它使用ThreadContextClassLoader从jar加载导入。但是,它失败了,因为它无法从类路径/jars中找到导入的xml

实现这一目标的渐进方式是什么

// 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();
   } 
}
//梯度任务主体
@任务输入
void execute(递增的AltaskinPuts输入){
inputs.outOfDate{changes->
//CodeGenerator是供应商库
CodeGenerator=新的CodeGenerator();
//调用一些setter方法来设置输入。
//

generators.setXml(文件(“jar文件是zip存档文件。您可以使用java.util.zip类将它们作为ZipFile打开。在gradle中,您可能希望使用ziptree进行解压缩,如下所述:

jar文件是zip存档文件。您可以使用java.util.zip类将其作为ZipFile打开。在gradle中,您可能希望使用ziptree进行解压缩,如下所述:
代码生成器是否有
设置类加载器(类加载器)
方法?您可能会使用
配置和
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")
    }
}

查看类似的概念代码生成器
是否有
设置类加载器(类加载器)
方法?您可能会使用
配置
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
设置类加载器的选项。因此,唯一的选项是让jar和xml文件由与CodeGenerator`相同的类加载器加载

选项1:将jar添加到
buildscript{…}
块中的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'
}

从我的另一个回答中,我们已经确定没有为
CodeGenerator
设置类加载器的选项。因此,唯一的选项是让jar和xml文件由与CodeGenerator`相同的类加载器加载

选项1:将jar添加到
buildscript{…}
块中的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'
}

我知道如何获取ZipEntry。问题是我向库提供了xml的名称,仅此而已。库本身解析xml并计算要导入的其他xml。我没有获取要加载的文件名的机制。我知道如何获取ZipEntry。问题是我向库提供了xml的名称,仅此而已。库rary本身解析Xml并计算要导入的其他Xml。我没有获取要加载的文件名的机制。也许您可以粘贴当前从gradle调用供应商库的方式。然后可能只是将jar添加到该命令的类路径。也许您可以粘贴当前调用供应商库的方式gradle的brary。那么可能只是将jar添加到该命令的类路径中的问题。不幸的是,没有设置URLClassLoader的setter方法。不幸的是,没有设置URLClassLoader的setter方法。谢谢,选项1对我有效。我很想知道选项2与选项1的不同之处。您会使用选项2吗如果您想在
buildSrc/src/main/java
中编译额外的任务等,谢谢,选项1对我很有用。我很想知道选项2与选项1有什么不同。如果您想在
buildSrc/src/main/java
中编译额外的任务等,您会使用选项2