大家好。
我在我的 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/