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")
...同じ結果です。
これは私には奇妙すぎる。この動作が表示される理由をデバッグまたは解放するためのポインタをいただければ幸いです。