0

かなりの数のLinuxサーバーで実行されているサーバー側のJava6アプリがあります。アプリケーションの実行中に誰かが誤って jar ファイルをアップグレードすることがあります。

その場合、まだ使用されていないクラス (多くの場合、ShutdownHandler コード) を次にロードしようとすると、ClassNotFoundException で失敗します。

必要なクラスを取得するために、変更された jar ファイルを読み取っても問題ないことをクラスローダーに伝えたいと思います。必須ではありませんが、これによりクラスローダーが既にロードされているクラスを再読み込みすることになるかどうかは気にしません。

4

2 に答える 2

2

これには独自のクラスローダーを作成する必要があり、既存のクラスローダーに干渉しないように、jar はクラスパスの外にある必要があります。

jar が変更されたことが検出されたら (X 秒ごとにファイル スタンプを確認します)、アプリケーションを停止するように指示し、古いクラスローダーを破棄し、新しいクラス ローダーを作成し、アプリケーションに新しいクラスローダー内で開始するように指示します。

このようにしないinstanceofと、友達と一緒にいると正しく動作しません。(これについて詳しく知りたい場合は、JNDI のすべての詳細を調べてください)。

これを行う最も簡単な方法は、それを Web アプリケーション (WAR) として作成し、それをサーブレット コンテナーにデプロイすることです。ここで、Web アプリケーションのセットアップと破棄の一部として必要な作業が行われます。サーブレット コンテナーに Web サーバー プレゼンス (http ポート リスナーなど) を持たせる必要はありません。

最近のほとんどのサーブレット コンテナーでは、自動再デプロイが可能です。良い、小さいものは Jetty です。

于 2011-09-08T17:17:43.393 に答える
0

問題は、開かれた元のファイルが削除されている可能性があります。(および置き換えられます) 新しい jar は同じファイル名を持つ可能性がありますが、元のファイルではありません。これを許可するように ClassLoader をカスタマイズできるはずですが、アプリケーション サーバーが既にこれをサポートしていない限り、機能しない可能性があります。

本当の答えは、実行中のアプリケーションを変更しないことです。

于 2011-09-08T16:48:17.150 に答える