1

私は2つのプロジェクトに分割されたソリューションを持っています:

  • 独立したプロジェクトにはインターフェースが含まれExampleInfており、アプリケーションに必要ないくつかのサービスを宣言しています。これらのサービスは、サードパーティ API ( Hadoopクライアント API) によって提供されます。このプロジェクトには、GUI コンポーネントとその他のアプリケーション ロジックが含まれていますが、によって宣言されたサービスを提供するサード パーティのライブラリはリンクされていませんExampleInfExampleInfこのプロジェクトで実装するクラスはありません。
  • サードパーティ ライブラリへのリンクを含む依存プロジェクト。このプロジェクトにはExampleImpl、サード パーティの API をカプセル化して実装するクラスが含まれていますExampleInf

独立したプロジェクトには、Aによって宣言されたサービスを消費(使用)するクラス(クラスと呼びましょう)がありますExampleInf独立プロジェクトは依存プロジェクトをリンクしないため、使用するには実行時にその実装を動的にExampleInfロードする必要があります。ExampleImplまた、 に必要なすべてのサードパーティ ライブラリを動的にロードする必要がありますExampleImpl

現在、これは、動的にロードされるリソースが配置されている依存public static final Stringプロジェクトへのパスと、多くの厄介なコードを含む一連の定数 (属性) によって行われます。これは良い解決策だとは思いません。これを行うためのパターン、ベストプラクティス、または一般的な方法はありますか? あなたの経験で何をお勧めしますか?ClassLoader

このパターンは、Java EE での依存性注入を少し思い出させます。少なくとも、動的にロードする必要があるクラスとライブラリ (.jar-s) の場所を XML に外部化し、ClassLoader.loadClass定数ごとに個別に呼び出すのではなく、それらすべてをサイクルでロードすることをお勧めします。同じパッケージに XML をロードし、その XML で指定されたクラスと jar をロードするためのきれいな方法はありますか? コード例をいただければ幸いです。

4

1 に答える 1

1

ServiceLoaderユーティリティを使用してこれを行うことができます(これは、xml ライブラリや最新の jdbc ドライバー ライブラリなど、ロードされる jdk サービスの数です)。依存プロジェクトが起動時にクラスパスの一部である場合は、問題ありません (正しくセットアップされていると仮定します)。それ以外の場合は、依存プロジェクトをネストされたクラスローダーにロードし、それをload(Class,ClassLoader)メソッドに渡す必要があります (または、を呼び出す前にクラスローダーを現在のコンテキスト クラスローダーとして設定しますload(Class))。

于 2012-11-12T19:40:09.920 に答える