我很困擾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