プラグイン可能なJavaプログラムを作成する方法は?
-
09-06-2019 - |
質問
プラグインで拡張できるJavaプログラムを作成したい。どうすればそれを行うことができ、どこで探すべきですか?
プラグインが実装しなければならないインターフェイスのセットがあり、jarにある必要があります。プログラムは、(プログラムに対する)相対フォルダーで新しいjarファイルを監視し、何らかの方法でそれらを登録する必要があります。
Eclipse RCPは好きですが、単純なニーズには多すぎると思います。
Springでも同じことが言えますが、とにかくそれを見ていたので、試してみることもできます。
それでも、自分のプラグイン" framework"を作成する方法を見つけたいできるだけシンプル。
解決
過去に書いたソフトウェアに対してこれを行いました。とても便利です。最初に、すべての「プラグイン」クラスを実装するために必要なインターフェースを作成しました。次に、Java ClassLoader を使用してそれらをロードしましたクラスを作成し、それらのインスタンスを作成します。
これを実行する1つの方法は次のとおりです。
File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};
ClassLoader cl = new URLClassLoader(classUrl);
Class loadedClass = cl.loadClass("classname"); // must be in package.class name format
クラスをロードしたので、インターフェース名がMyModuleであると仮定して、クラスのインスタンスを作成する必要があります。
MyModule modInstance = (MyModule)loadedClass.newInstance();
他のヒント
OSGi をご覧ください。
一方で、OSGiは、モジュール式ソフトウェアコンポーネントを使用して、他の多くのことを管理、開始、実行するためのあらゆる種類のインフラストラクチャを提供します。一方、私はあなたのニーズに対してあまりにも重いかもしれません。
ちなみに、EclipseはOSGiを使用してプラグインを管理しています。
をよく見ることをお勧めしますJava Service Provider(SPI)API 。これは、特定のサービスの実装として自身を公開するクラスパス上のすべてのJarのすべてのクラスを見つけるためのシンプルなシステムを提供します。過去にプラグインシステムで使用してきましたが、非常に成功しています。
2番目に受け入れられたソリューションですが、基本的なプラグインサポートが必要な場合(ほとんどの場合)、 Javaプラグインフレームワーク(JPF)。適切なドキュメントはありませんが、非常にきれいなプラグインフレームワークの実装です。
これは簡単にデプロイでき、クラスローディングの特異性を乗り越えて開発するのは非常に簡単です。上記に対するコメントは、pathという名前の通常のパッケージパスにクラスファイルをデプロイすることに加えて、プラグインディレクトリの下のプラグインロードパスに full クラスパスの名前を付ける必要があることに注意してください。例:
plugins
`-com.my.package.plugins
`-com
`-my
`-package
`-plugins
|- Class1.class
`- Class2.class
自家製のクラスローダーのアプローチ: クラスローダーについて学ぶのは間違いなく良い方法ですが、「クラスローダーの地獄」と呼ばれるものがあります。これは、大規模なプロジェクトで使用する際にそれと格闘している人々によって主に知られています。競合するクラスは簡単に導入でき、解決が困難です。
そして、Eclipseが数年前にOSGiに移行した理由は十分にあります。 したがって、ペットプロジェクト以上の場合は、OSGiを真剣に検討してください。見る価値があります。 クラスローダーと新しい技術標準について学びます。
Eclipseのリッチクライアントプラットフォーム上に構築し、Eclipse拡張フレームワークを公開することを検討しましたか?
また、あなたのニーズによっては、Spring Frameworkがそれとあなたがやりたいことを助けるかもしれません: http ://www.springframework.org/