我很困扰ClassLoader尝试解析仅在特定条件下工作的资源的情况。ClassLoader仅在特定线程中发现资源
用例如下:我将IBM Rational Functional Tester与JBehave结合使用进行自动验收测试。 JBehave将测试指定为纯文本故事文件。这些故事文件可以引用其他故事文件,即所谓的“给定故事”。 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")
...有相同的结果。
这对我来说太奇怪了。任何用于调试或放弃此行为显示的指针都是值得赞赏的!
谢谢,这指出我正确的方向!在JBehave中,我能够以不同的方式配置测试的执行。而不是使用[LoadFromClasspath]的默认构造函数(http://grepcode.com/file/repo1.maven.org/maven2/org.jbehave/jbehave-core/3.7.5/org/jbehave/core/io/LoadFromClasspath 。java#LoadFromClasspath),它使用TCCL,我现在用“我的”类实例化了LoadFromClasspath,现在类加载器能够找到所有的资源。 – AndreasEK