【问题标题】:Gradle task to load files from Jar从 Jar 加载文件的 Gradle 任务
【发布时间】:2017-12-01 18:03:08
【问题描述】:

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

完成这个的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();
   } 
}

【问题讨论】:

  • 也许您可以粘贴当前从 gradle 调用供应商库的方式。那么也许这只是将 jar 添加到该命令的类路径的问题。

标签: gradle gradle-task


【解决方案1】:

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

选项 1:将 jar 添加到 buildscript { ... } 块中的 buildscript 类路径

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

选项 2:通过 buildSrc/build.gradle 将 jar 添加到 buildscript 类路径

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

【讨论】:

  • 谢谢,选项 1 对我有用。我很想知道选项 2 与选项 1 有何不同。
  • 如果你想在buildSrc/src/main/java中编译额外的任务等,你可以使用选项2
【解决方案2】:

CodeGeneratorsetClassloader(Classloader) 方法吗?您可能会使用ConfigurationURLClassloader。例如:

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

【讨论】:

  • 很遗憾,没有设置 URLClassLoader 的 setter 方法。
【解决方案3】:

jar 文件是 zip 档案。您可以使用 java.util.zip 类将它们作为 zip 文件打开。在 gradle 中,您可能希望使用 ziptree 进行提取,如下所述: http://mrhaki.blogspot.jp/2012/06/gradle-goodness-unpacking-archive.html

【讨论】:

  • 我知道如何获取 ZipEntry。问题是我向库提供了 xml 的名称,仅此而已。库本身解析 Xml 并计算要导入的其他 Xml。我没有机制来获取要加载的文件的名称。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2014-07-15
  • 2020-07-26
  • 2014-12-26
相关资源
最近更新 更多