2012-05-11 15 views
3

私はユーティリティ用のjarライブラリを開発しています。jarのオプションサポートを実装する方法

外部のjars /ライブラリへの依存を大幅に減らしたいが、クラスパスに存在するライブラリがネイティブサポートされている。

例えば、私はライブラリがハイバネートで動作するルーチンを提供したいと思っています。ただし、休止状態のjarファイルが存在しない場合は、エラーが発生してアプリケーションが終了することは望ましくありません。

私のライブラリーにhibernate jarファイルをバンドルすることなく、これを実装する方法はありますか?あなたの初期化中

+0

jarファイルからクラスをロードするためのClassLoadersの使用を確認してください – maress

答えて

6

、あなたはHibernateのクラスのいずれかを調べるためにClass.forNameを使用することができ、そしてそれはClassNotFoundExceptionキャッチにそれをスローした場合、あなたはあなたがいないと知っているように、Hibernateは  —がフラグを設定した環境ではありません知っていますHibernate固有のことをする。

しかし、いずれかのクラスがHibernateクラスを静的に(例えば、importによって)参照している場合、Hibernateがクラスパスにない場合、それらのクラスはロードされません。これを処理する通常の方法は次のとおりです。

  • Hibernate固有のものへのインターフェイスを作成します。 HibernateStuff
  • メインコードのインターフェイスのみを参照し、メインコードのHibernateクラスはimportで参照しないでください。
  • そのインターフェイスを実装しているクラスにHibernate固有のものを入れてください。たとえば、HibernateStuffImplです。 これはクラスです。import Hibernate stuff。
  • あなたHibernateStuffImplをロードし、タイプHibernateStuffの変数に代入、そのインスタンスを作成するためにClass#newInstanceを使用するClass.forNameを使用し、Hibernateは(Class.forName経由)クラスパスにあると判断したら。
  • この変数を使用して、Hibernate固有のものを呼び出します。
  • 何もせずにインターフェイスを実装するHibernateStuffStubクラスがあり、Hibernateがロードされていないときにそのインターフェイスを使用すると、コードに条件文が追加されません。 (JVMはノーオペレーションで非常に高速です。)

...もちろん、上記のすべては、Hibernateだけでなく、何にも当てはまります。

関連する問題