类路径中的 Groovy 资源未加载

标签 groovy resources classloader

大家好。

我在我的 groovy 项目(IDE - Intellij Idea 12.6)中使用 spock 框架进行测试。我的 spock 规范类将文件名传递给 groovy 对象进行处理(该文件肯定在类路径中),但是当我尝试以这种方式获取该文件时

    def resource = getClass().getClassloader().getResourceAsStream(filepath)
    assert resource != null : "No input stream found for path ${filepath}"
    def rootNode = new XmlParser().parse(resource)

然后resource == null

我尝试调试并在表达式评估窗口中这段代码 getClass().getResource(fileName) 返回资源。

我试图检查在第一种情况下(在带有代码的类中)和第二种情况下(表达式求值窗口)使用了哪个类加载器。

在第一种情况下,类加载器是 sun.misc.Launcher$AppClassLoader@18dabf1,但在表达式评估窗口中,类加载器是 groovy.lang.GroovyClassLoader$InnerLoader@1e69757 我想这就是我的资源为空的原因。

有人可以指导我做错了什么以及如何加载该资源文件吗?

更新:

改变了资源文件的解析方式。当 filepath - 文件的完整路径有效时,但如果 filepath 只是文件名并且该文件在类路径中,则 resource == null/p>

更新 2:

改变资源文件的加载方式,清理依赖位,一切正常,我想昨天不是我的一天。

最佳答案

这个问题很可能与 Spock 无关。从远处很难说是什么原因造成的,但读取资源最安全的方法是 getClass().getClassLoader().getResourceAsStream()Thread.currentThread().getContextClassLoader( ).getResourceAsStream(),视环境而定。

不确定当您执行 new File(resource) 时 Groovy 做了什么,因为没有 File(URL) 构造函数(只有一个 File(URI) 构造函数)。无论如何,应尽可能避免从类路径获取 File

关于类路径中的 Groovy 资源未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20213256/

相关文章:

grails - Grails域对象成员如何具有基于计算值的默认名称?

json - 使用 Grails 在服务器端获取 JSON 数据

android - 计算可绘制文件夹中以特定字符串开头的项目

testing - 如何使用 Gradle 在测试中获取资源?

xml - 使用 Groovy 将 org.w3c.dom.Document 转换为 XML 字符串

java - 将 MarkupBuilder 与 Groovy 结合使用...创建 XML 参数时出现问题

java - 如何从 jar 文件动态运行 java 类

Java 类加载器

file - 编译后使用 CHEF 中的文件资源复制本地文件

java - 从 sbt 程序集运行 uber jar 会导致错误 : Could not find or load main class