art*_*mka 1 groovy resources classloader
今天是个好日子.
我在我的groovy项目中使用spock框架进行测试(IDE - Intellij Idea 12.6).我的spock规范类将文件名传递给groovy对象进行处理(该文件肯定在classpath中),但当我尝试以这种方式获取该文件时
def resource = getClass().getClassloader().getResourceAsStream(filepath)
assert resource != null : "No input stream found for path ${filepath}"
def rootNode = new XmlParser().parse(resource)
Run Code Online (Sandbox Code Playgroud)
然后resource == null.
我尝试调试,在Expression Evaluation窗口中,此代码getClass().getResource(fileName)返回资源.
我试图检查在第一种情况下使用哪个类加载器(在类中使用代码)和第二种情况(表达式评估窗口).
在第一种情况下,类加载器是sun.misc.Launcher$AppClassLoader@18dabf1,但在Expression Evaluation窗口中,classloader是groovy.lang.GroovyClassLoader$InnerLoader@1e69757我认为这是我的资源为空的原因.
有人可以指导我做错了什么,如何加载该资源文件?
更新:
更改了资源文件的解析方式.当filepath- 文件的完整路径有效,但如果filepath只是文件名和那个文件在classpath中resource == null
更新2:
更改资源文件加载的方式,清理依赖项位,一切正常,我想昨天不是我的一天.
这个问题很可能与Spock无关.很难从远处说出造成它的原因,但最安全的读取资源的方式是,getClass().getClassLoader().getResourceAsStream()或者Thread.currentThread().getContextClassLoader().getResourceAsStream(),取决于环境.
不确定Groovy做什么new File(resource),因为没有File(URL)构造函数(只有File(URI)构造函数).在任何情况下,File应尽可能避免从类路径中获取.
这可能是因为 Groovy 可能会以与您认为正在发生的情况不同的方式解释对象的类。请参阅以下其他 StackOverflow 项目:
为什么 groovy .class 返回的值与 .getClass() 不同
当类错误时,ClassLoader 可能会被引导加载程序和 getClassLoader 返回 null。
所以不要使用像这样的语句
def resource = getClass().getClassloader().getResourceAsStream(filepath)
Run Code Online (Sandbox Code Playgroud)
使用类似的语句指定实际的类
def resource = MyClass.class.getClassLoader().getResourceAsStream(filePath)
Run Code Online (Sandbox Code Playgroud)
在几乎相同的情况下为我工作。