在 Gradle 插件中使用 Ant 的 xslt 任务并使其找到资源

Using Ant's xslt task in a Gradle plugin and make it find a resource

我目前正在开发一个 Gradle 插件,该插件的 JAR 包含一个 XSL 文件,我想在由 Gradle 调用的 Ant 的 xslt 任务中使用该文件:

ant.xslt(in: reports.xml.destination,
         out: new File(reports.xml.destination.parent, basename + '.html')) {
    style {
         // From https://svn.apache.org/repos/asf/hive/trunk/checkstyle/checkstyle-noframes-sorted.xsl.
        javaresource(name: 'checkstyle-noframes-sorted.xsl')
    }
}

然而,虽然我已经将 checkstyle-noframes-sorted.xsl 包含在插件 JAR 的几乎每个目录中,但我仍然得到

Caused by: : stylesheet checkstyle-noframes-sorted.xsl doesn't exist.
    at org.apache.tools.ant.taskdefs.XSLTProcess.handleError(XSLTProcess.java:1413)

所以我猜 classpathloaderRef 或两者都是错误的。尽管阅读 several answers to similar questions 之后,我尝试了几种组合,但它们都产生了相同的错误。

我需要指定什么才能使 Gradle 插件发现嵌入到其 JAR 中的资源?

它不能开箱即用的原因是我错过了 ant.xslt 调用被进一步包裹在 antBuilder.withClasspath(getCheckstyleClasspath()).execute 闭包中,它显式地更改了类路径。因此,最简单的解决方案是简单地将 ant.xslt 移出该闭包。

如果这适用于您的情况,另一种解决方案是将 XSL 文件加载到 Groovy 代码中的变量并将其作为字符串传递给 Ant:

def xsl = Checkstyle.getClassLoader().getResourceAsStream('checkstyle-noframes-sorted.xsl')
// ...
style {
   string(value: xsl.text)
}