私は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 をロードするためのきれいな方法はありますか? コード例をいただければ幸いです。