2016-07-06 20 views
0

長期実行JavaアプリケーションのjarファイルをロードするのにClass.getResource()を使用しています。それはうまく動作します。しかし、アプリが長時間実行された後、それはnullを返し始めます。長時間実行した後にClass.getResource()がnullを返す

このトラブルシューティングを行うにはどうすればよいですか?私が見ることができるのは、nullを返すgetResource()によって引き起こされる例外です。私はなぜそれが返すのを見つけることができませんnull

私はClass.getResourceAsStream()によって返された閉鎖されていないストリームを確認しましたが、私はそれを呼びません。 (私のライブラリの1つかもしれませんが...)私はFileInputStreamsがクローズされていないかチェックしましたが、何も見つかりませんでした。 (これが起こっている間、FileInputStreamsは引き続き使用可能です。)

編集:これはthis oneと同じ問題のようです。また、possibly related

+0

を私はURL.openStream()によって返されたInputStreamからMANIFEST.MFのうちバージョンを読んでいたコードを持っていました問題のクラスを逆コンパイルし、同じメソッドを呼び出して、結果をログに記録します。最初は、 'Class.getClassLoader0()'、 'Class.getClassLoader0()。getResource()'、 'Class.getClassLoader0()。getParent()。getResource()'、 'Class.getClassLoader0() '.getBootstrapResource()'と 'Class.getClassLoader0()。findResource()'(ほとんどはリフレクションによってのみアクセス可能です)。 – Siguza

+0

@Siguzaありがとう!私はそれを試み、数週間後に報告します。 – alexantd

答えて

0

私はそれを修正しました。

String manifestPath = classPath.substring(0, webInfIndex) + 
     "/META-INF/MANIFEST.MF"; 

// DON'T DO THIS!!! 
// openStream() returns an InputStream that never gets closed. 
Manifest manifest = new Manifest(new URL(manifestPath).openStream()); 
Attributes attr = manifest.getMainAttributes(); 
String version = attr.getValue(Attributes.Name.IMPLEMENTATION_VERSION); 

のtry-で、リソースのJava 7を使用して、リークの修正:私はすることから始めたい

try (InputStream inputStream = new URL(manifestPath).openStream()) { 
    Manifest manifest = new Manifest(inputStream); 
    Attributes attr = manifest.getMainAttributes(); 
    String version = attr.getValue(Attributes.Name.IMPLEMENTATION_VERSION); 
} 
関連する問題