我正在努力解决 ClassLoader 试图解析资源的情况,该资源仅在某些条件下有效。
用例如下: 我使用 IBM Rational Functional Tester 和 JBehave 进行自动化验收测试。JBehave 将测试指定为纯文本故事文件。这些故事文件可以引用其他故事文件,即所谓的“Given Stories”。JBehave 使用ExecutorService执行可能是多线程的故事。虽然 JBehave 加载文本文件(使用 ClassLoader.getResourceAsStream)没有问题,但它无法在从 ExecutorService 启动的线程中找到相同的文件。
实际中的 ClassLoader 是ContextFinder。在调试应用程序并暂停两个线程时,最初启动 JBehave 的“主线程”和从执行器服务启动以运行故事文件的“故事线程”,我可以识别类加载器的实例是相同的。还有父母的例子等等。
但是打电话给
Thread.currentThread().getContextClassLoader().getResource("HelloWorld.story")
在主线程中完美运行,故事线程失败并返回 null。
从 ContextFinder 的源代码来看,除了为堆栈上的类收集所有 ClassLoader 之外,它似乎没有做任何其他事情。所以我尝试了这个:
SomeClass.class.getClass().getClassLoader().getResource("HelloWorld.story")
......结果相同。
这对我来说太奇怪了。任何用于调试或解释为什么显示此行为的指针都值得赞赏!