ワーカー JVM を使用してさまざまなことを行うアプリケーション サーバーに取り組んでいます。
ワーカー jvm は、-cp スイッチを使用して開始され、ベンダー ライブラリおよびその他の重要な機能を含む JAR ファイルを指定します。
jarファイルのクラスがコードを適切にロードして実行するという非常に興味深い問題がありますが、jarファイル内のリソースにアクセスしようとすると(特に getResourceAsStream() メソッドを使用して)、見つけられないと主張して爆発します。これらのリソースが、ロードされている JAR に確実に存在することを確認しました。実際、JAR を操作してリソースを外部で検索すると、機能します。問題は、これらはすべて独自のライブラリであり、ソースが付属していないため、逆コンパイルとメソッド エントリ ブレークポイントを通じてすべてを実行する必要があるという点で、私は不自由です。
おそらく最も奇妙な点は、これらのライブラリが何ヶ月も変更されておらず、他の (実稼働を含む) アプリ サーバーで動作していることです。
それらはJRE 1.6.0_17にあります
だから私の質問は
- -cp エントリを持つ JVM が jar から CLASSES をロードできるのに、RESOURCES をロードできないのはなぜですか?
- このレルムの何かが JRE 1.6.0_06 から 1.6.0_17 に変更されますか (これは最近変更されました)
明確にするために、JAR 構造では、これらのリソースは jar のルートにあります。
resource.prop
META-INF/Manifest
package/package/class.class
JAR 自体は、ロードされると明らかにクラスパス上にあります。ただし、次のすべてはNULLに解決されます(はい、これは私を狂わせているので、実際に3つすべてを試しました):
Jarclass.getClassLoader().getResourceAsStream("./resource.prop");
Jarclass.getClassLoader().getResourceAsStream("/resource.prop");
Jarclass.getClassLoader().getResourceAsStream("resource.prop");
これは、すべてのコンピューターで JAR のリソースにアクセスできないのと似ていますが、その質問に対する解決策はありません。