3

私は、その仕事をしている単一の .jar に含まれているソフトウェアを持っていますが、残念ながら、この jar の現在実行中の実行がある場合、.jar ファイルを中央の場所に置き換える必要があるバグ修正をすばやくプッシュする必要がある場合があります。ファイルを置き換えると、「クラスが見つかりません」というエラーでクラッシュします。jarファイルが実行されると、JVMはそれをメモリにキャッシュし、ディスクからの読み取りを行わないと思いましたが、明らかにそうではありません.どうすれば(可能であれば)これを修正できますか?

編集:

アプリケーションは Web ベースではありません。通常の Java SE です。

4

2 に答える 2

3

JAR ファイルは、他の共有オブジェクト ライブラリとは異なり、大量にメモリにロードされません。それらのクラスは必要に応じてメモリにロードされるため、JAR ファイルを削除してクラス ルックアップを実行する必要がある場合、クラス ローダーのファイル ハンドルは無効になり (参照していた開いているファイルがなくなったため)、次のようになります。エラー。

オペレーティング システムがファイル ハンドルを管理するため、開いているファイルを新しいコピーに置き換えても、だまされることはありません。最初にファイルを閉じる必要がありますが、これは多くの場合、クラス ローダーのガベージ コレクションによってのみ実行できます。システム クラス ローダーを使用している場合、それは JVM をシャットダウンすることを意味します。

システム クラス ローダーとは別に破棄できるカスタム クラス ローダーを作成するためのフレームワークが作成されています。ただし、これはクラスのロードを複雑にします。あなたが求めていることを達成することはできますが、既存のプログラムを再構築して、フレームワークのクラスローダーでのクラスのルックアップに対応する (そして、時間の経過に伴うクラスローダーの損失と利益に対応する) ことなしには実現できません。

このようなフレームワークを試してみたい場合は、Christian の投稿を参照してください。あるプロジェクトがどのようにクラス ローダーを使用してそのニーズを容易にするかについてもう少し知りたい場合は、Web アプリケーションを独自のクラス ローダー内に制限する Apache の Tomcat の内部をのぞいてみてください。

多くの場合、展開前にサービスを停止し、展開後にサービスを開始することが正しい答えであることがわかります。

于 2012-05-24T16:21:31.017 に答える
1

私が考えることができる唯一の 2 つの可能性は、JRebelまたはOSGiを使用することです。

于 2012-05-24T15:55:37.483 に答える