3

ユーティリティ用のjarライブラリを開発しています。

外部の jar/ライブラリへの依存を大幅に削減したいのですが、そのようなライブラリがクラス パスに存在する場合はネイティブ サポートを提供します。

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

休止状態の jar をライブラリにバンドルすることなく、これを実装する方法はありますか?

4

1 に答える 1

7

初期化中に、Hibernate クラスの 1 つを検索するために使用できます。Class.forNameそれが catch をスローし、ClassNotFoundExceptionHibernate が環境にないことがわかっている場合は、フラグを設定して、Hibernate 固有の処理を実行しないようにします。

ただし、クラスのいずれかが Hibernate クラスを静的に (たとえば を介してimport) 参照する場合、Hibernate がクラス パスにない場合、それらのクラスはロードされないことに注意してください。これに対処する通常の方法は次のとおりです。

  • Hibernate 固有のものへのインターフェイスを作成しますHibernateStuff
  • メイン コードからはインターフェースのみを参照し、メイン コード内の Hibernate クラスはimport.
  • そのインターフェイスを実装するクラスに Hibernate 固有のものを配置しますHibernateStuffImplそのクラスはimportものを休止させることができます。
  • Class.forNameHibernate が ( 経由で)クラスパスにあると判断したら、 を使用Class.forNameしてロードし、HibernateStuffImplを使用Class#newInstanceしてそのインスタンスを作成し、それを type の変数に割り当てますHibernateStuff
  • その変数を使用して、Hibernate 固有のものを呼び出します。
  • 何もせずにインターフェースを実装するHibernateStuffStubクラスがあり、Hibernate がロードされていないときにそれを使用すると、コードに条件ステートメントが散らばることがありません。(JVM はノーオペレーション コールで非常に高速です。)

...そしてもちろん、上記のすべては、Hibernate だけでなく、あらゆるものに当てはまります。

于 2012-05-11T08:45:12.787 に答える