2

私は、中央のスレッドによって監視されている間に複数の異なるタスクを実行できるプログラムを作成するというアイデアをいじっています。アイデアは、実行時/実行中に個別のモジュールを探してロードするコアプログラムを作成することです。これらのモジュールは、完成したオブジェクトを別のモジュールに渡す前に独自のタスクを実行します。別のモジュールは、完成品を Web サーバーにアップロードしたり、結果データを事前に定義されたファイル/フォルダー構造に整理したりするなどの処理を行います (画像を参照)。基本的な概念のため)。 ここに画像の説明を入力 私はこれまで Java のモジュラー設計を実際に扱ったことはありません。私の過去のプログラムはすべて完全に自己完結型であったため、どこから始めればよいかほとんどわかりません。

私の目標は、外部ライブラリをコア プログラムに格納することです (たとえば、AWS SDK for Java は、.jar 自体を最大約 18 MB まで発射できます)。 1 行のバグを修正するためだけに、18 MB 以上の自己完結型プログラム全体を再配布する必要があります。さらに、必要に応じて、プログラム全体を再起動することなく、個々のモジュールを更新できるようにしたいと考えています。これにより、1 つの更新中に他のモジュールが動作し続け、全体的なダウンタイムが短縮され、プログラムが必要な時間だけが更新されるようになります。完全にシャットダウンするのは、コアへの更新が行われたときです。

私が知りたいのは、これは可能ですか(私はそう仮定しています) 、もしそうなら; 何を調べる必要がありますか/どのように設定しますか? (私は車輪を再発明しようとしていますか? もしそうなら、どこでその車輪を見つけることができますか?)

の使用を調べて、ここServiceLoaderで例を試してみましたが、それを使用してあるモジュールを別のモジュールに向ける方法や、コアからライブラリ クラスを取得できるかどうか、または "アクティブな更新」が言及されました。これまでに見たのは、(私の例では) コアがモジュールにアクセスできるということだけですが、モジュールがコアにアクセスするかどうか/どのようにアクセスするかはわかりません。

それが投稿に関連しているかどうかはわかりませんが、私はすべての作業を Eclipse 内で行っています (利用可能な IDE 固有のツールがある場合に備えて言及する価値があると考えました)。

4

2 に答える 2

4

OSGi を見てみましょう。バンドル構造は、基本的に探しているものです。OSGi では、➕ メタデータを含む jar である「バンドル」を作成して、ランタイム (Apache Felix や Eclipse Equinox など) に、バンドルが持つ依存関係と提供するものを伝えます。OSGi を使用すると、各バンドルを他のすべてのバンドルとは独立して開始、停止、および更新できます。また、他の機能に依存することさえ停止し、バンドルの更新後にそれらを再起動します (適切に構成した場合;))

@bhspencer:標準のJavaクラスローダーではクラスのアンロードが許可されていないため、新しいjarをロードするだけでは適切に更新できません。

于 2015-03-13T18:00:39.110 に答える
0

Classをからアンロードすることはできませんが、JVM へのすべての参照とロードしたクラスのすべてのインスタンスへの参照を null にすることで、JVM から ClassLoader全体をアンロードできます。良い出発点になります。ClassLoaderURLClassLoader

于 2015-03-13T18:09:21.197 に答える