いくつかの例に基づいて、独自のクラスローダーを実装してみました。ただし、期待どおりに機能していないと思います(Jarファイルをリロードできないなど)。Jarファイルのロードを処理するためにOSGIまたはApache Felixを使用することを推奨する参考文献はほとんどありません.Jarをロードし、Jarからクラスをインスタンス化する例はありますか?
私が達成しようとしていることの詳細..基本的に継続的に実行されるJavaコマンドラインアプリケーションがあります。実行時に JAR ファイルを動的に参照し、実行時にこれらの jar 内のクラスを参照できるようにしたいと考えています。これらの jar には、1 つ以上のサポート クラスが含まれる場合があります。これらの Jar は基本的にカスタマイズされた作業単位であり、継続的に実行されているメイン アプリケーションから特定のイベント条件によって実行されます。.. これはマルチクライアントなので、jar をプラグイン可能なタイプのワークユニットにしたかったのです。
私の現在の方向性は、「クライアント」にコーディングするためのインターフェースを提供し、クラスを jar ファイルにパッケージ化することです。次に、アプリケーションは構成された (データベース) jar パスを実行し、Jar からクラスを実行します。これはjarとクラスのロードで機能しますが、本質的にこれらのjarをホットデプロイできるようにしたいと考えています。
要約すると、関数をサポートするクラスを含む JAR ファイルが必要です。実行時に Jar から (メインのループ アプリケーションから) 参照される定義済みクラス。メイン アプリケーションの実行中に JAR ファイルを変更する機能。
サードパーティのライブラリを使用する場合は、Apache Felix を使用することをお勧めします。
ありがとう
私はApache Felix 4を使用してそれを理解したと思います.これはjar/classesをロードする最良の方法ですか? または、より効率的な方法があります。これまでの私の調査では、解決策は 1 つではありませんでした。ありがとう。
FrameworkFactory ff = new FrameworkFactory ();
Map<String,Object> config = new HashMap<String,Object>();
config.put("org.osgi.framework.storage", "c:\\temp\\myclientBundles");
config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
"packages needed,more packages needed");
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");
Framework fwk = ff.newFramework(config);
fwk.start();
BundleContext bc = fwk.getBundleContext();
Bundle bundle = bc.installBundle("file:C:\\my_client.jar");
bundle.start();
bundle.update();
Class clazz = bundle.loadClass("client.work.process");
Job pc = (Job) clazz.newInstance();
pc.startWork(someConfigObject);
bundle.stop();
fwk.stop();