今天是个好日子。
我正在使用 spock 框架在我的 groovy 项目(IDE - Intellij Idea 12.6)中进行测试。我的 spock 规范类将文件名传递给 groovy 对象进行处理(该文件肯定位于类路径中),但是当我尝试以这种方式获取该文件时
def resource = getClass().getClassloader().getResourceAsStream(filepath)
assert resource != null : "No input stream found for path ${filepath}"
def rootNode = new XmlParser().parse(resource)
Then resource == null
.
我尝试调试并在表达评估窗口中此代码getClass().getResource(fileName)
返回资源。
我尝试检查第一种情况(与代码的类中)和第二种情况(表达式评估窗口)中使用的类负载器。
在第一种情况下,类加载器是sun.misc.Launcher$AppClassLoader@18dabf1
,但在表达式求值窗口中类加载器是groovy.lang.GroovyClassLoader$InnerLoader@1e69757
我想这就是我的资源为空的原因。
有人可以指导我做错了什么以及如何加载该资源文件吗?
UPDATE:
更改了资源文件的解析方式。什么时候filepath
- 文件的完整路径,但如果filepath
只是文件名和类路径中的该文件resource == null
UPDATE2:
更改资源文件加载的方式,清理依赖项,一切正常,我想昨天不是我的日子。
这个问题很可能与 Spock 无关。从远处很难说是什么原因造成的,但读取资源最安全的方法是getClass().getClassLoader().getResourceAsStream()
or Thread.currentThread().getContextClassLoader().getResourceAsStream()
,取决于环境。
不确定 Groovy 当你这样做时会做什么new File(resource)
,因为没有File(URL)
构造函数(只有一个File(URI)
构造函数)。无论如何,获得一个File
应尽可能避免来自类路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)