[解決済み] javaでクラスをアンロードする?
質問
私はカスタムクラスローダーを持っていて、デスクトップアプリケーションが、私が話す必要のあるAppServerからクラスを動的にロードし始めることができるようにしています。これを行うために必要なjarの量は、(それらを出荷したい場合)ばかげているので、我々はこれを行いました。また、実行時にAppServerライブラリからクラスを動的にロードしない場合、バージョンの問題が発生します。
今、2つの異なるAppServersと話す必要がある問題にぶつかり、どちらのクラスを最初にロードするかによって、ひどく破損する可能性があることがわかりました...。実際にJVMを殺すことなく、クラスのアンロードを強制する方法はありますか?
これが意味をなすことを願う
解決方法は?
クラスがアンロードされる唯一の方法は、使用されたクラスローダーがガベージコレクションされる場合です。 つまり、すべてのクラスとクラスローダー自体への参照は、ドードーの道を行く必要があります。
あなたの問題に対する1つの可能な解決策は、すべてのjarファイルに対してクラスローダーを持ち、実際のクラスのロードを特定のjarクラスローダーに委ねるAppServersのそれぞれに対してクラスローダーを持つことです。 そうすれば、アプリサーバーごとに異なるバージョンのjarファイルを指定することができます。
しかし、これは些細なことではありません。 OSGiプラットフォームは、各バンドルが異なるクラスローダーを持ち、依存関係がプラットフォームによって解決されるため、まさにこれを実現しようと努力しています。 多分、良い解決策は、それを見てみることでしょう。
OSGIを使いたくない場合、一つの可能な実装として、1つのインスタンスで JarClassloader クラスは、すべての JAR ファイルに適用されます。
そして、クラスローダーを継承した新しいマルチクラスローダークラスを作成します。 このクラスは内部的に JarClassloader の配列(またはリスト)を持ち、defineClass() メソッドでは定義が見つかるか NoClassDefFoundException がスローされるまで内部のすべてのクラスローダーを繰り返し処理します。 新しい JarClassloaders をクラスに追加するために、いくつかのアクセッサ・メソッドを提供することができます。MultiClassLoader の実装はネット上にいくつか存在するので、自分で書く必要はないかもしれません。
サーバーへの接続ごとに MultiClassloader をインスタンス化すると、原理的には、サーバーごとに同じクラスの異なるバージョンを使用することが可能です。
ユーザー定義のスクリプトを含むクラスをメモリからロードおよびアンロードする必要があるプロジェクトで、MultiClassloaderのアイデアを使用したことがありますが、非常にうまく機能しました。
関連
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
Spring Boot による HTTPS アクセスの設定
-
をインスタンス化することができません。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
プロジェクトの依存関係を解決できなかった 解決
-
JQuery DataTable 详解
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
Java(1)仕上げの基本概念+eclipseのインストール構成