【发布时间】:2021-07-28 17:27:14
【问题描述】:
大家好。
我在我的 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
UPDATE2:
更改资源文件的加载方式,清理依赖项,一切正常,我想昨天不是我的一天。
【问题讨论】:
-
仅当资源与
getClass()引用的类在同一个包中时,并且仅在使用Class#getResourceStream(而不是ClassLoader#getResourceStream)时才有效。
标签: groovy resources classloader