Sun Java System Application Server Enterprise Edition 8.2 トラブルシューティングガイド

jar ファイルへのストリームが開いているためにアプリケーションを配備解除または再配備できない (Windows のみ)

説明

Windows システムでは、アプリケーションの実行後引き続きそのアプリケーションを配備解除または再配備しようとすると、サーバーでファイルの削除やディレクトリ名の変更を行えないという例外がスローされます。

Windows システムでは、アプリケーションで getClass().getResource または getResourceAsStream メソッドを使用して、アプリケーション内部のリソース、特にアプリケーション内にあるまたはアプリケーションからアクセス可能な jar ファイルのリソースを取得できます。ストリームが開いたままになっていると、それ以降のアプリケーションの再配備または配備解除が失敗する可能性があります。加えて、Java ランタイムは、パフォーマンス上の理由からデフォルトで jar ファイルへのストリームをキャッシュします。

解決法

アプリケーションで開いたストリームは必ず閉じてください。さらに、アプリケーションの再配備または配備解除を繰り返し行う必要があり、アプリケーションで getResource または getResourceAsStream を使用して jar ファイルからリソースを取得する必要もある場合は、URL オブジェクトを返す getClass().getResource の使用を検討してください。その後、url.setUseCaches メソッドを呼び出してその jar ファイルのキャッシュを無効にしてから、url.getInputStream() を使用してストリームを取得します。

jar ファイルアクセスのキャッシュを無効にするとパフォーマンスが低下することがありますが、この手法により確実にアプリケーションを配備解除または再配備できます。getClass().getResourceAsStream メソッドを代わりに使用すると、リソースが存在する jar ファイルがキャッシュされ (これがデフォルトの Java ランタイム設定)、サーバーが停止するまで開いたままになることにも注意してください。