私は2つのプロジェクトに分割されたソリューションを持っています:
- 独立したプロジェクトにはインターフェースが含まれ
ExampleInfており、アプリケーションに必要ないくつかのサービスを宣言しています。これらのサービスは、サードパーティ API ( Hadoopクライアント API) によって提供されます。このプロジェクトには、GUI コンポーネントとその他のアプリケーション ロジックが含まれていますが、によって宣言されたサービスを提供するサード パーティのライブラリはリンクされていませんExampleInf。ExampleInfこのプロジェクトで実装するクラスはありません。 - サードパーティ ライブラリへのリンクを含む依存プロジェクト。このプロジェクトには
ExampleImpl、サード パーティの API をカプセル化して実装するクラスが含まれていますExampleInf。
独立したプロジェクトには、Aによって宣言されたサービスを消費(使用)するクラス(クラスと呼びましょう)がありますExampleInf。独立プロジェクトは依存プロジェクトをリンクしないため、使用するには実行時にその実装を動的にExampleInfロードする必要があります。ExampleImplまた、 に必要なすべてのサードパーティ ライブラリを動的にロードする必要がありますExampleImpl。
現在、これは、動的にロードされるリソースが配置されている依存public static final Stringプロジェクトへのパスと、多くの厄介なコードを含む一連の定数 (属性) によって行われます。これは良い解決策だとは思いません。これを行うためのパターン、ベストプラクティス、または一般的な方法はありますか? あなたの経験で何をお勧めしますか?ClassLoader
このパターンは、Java EE での依存性注入を少し思い出させます。少なくとも、動的にロードする必要があるクラスとライブラリ (.jar-s) の場所を XML に外部化し、ClassLoader.loadClass定数ごとに個別に呼び出すのではなく、それらすべてをサイクルでロードすることをお勧めします。同じパッケージに XML をロードし、その XML で指定されたクラスと jar をロードするためのきれいな方法はありますか? コード例をいただければ幸いです。