ユーティリティ用のjarライブラリを開発しています。
外部の jar/ライブラリへの依存を大幅に削減したいのですが、そのようなライブラリがクラス パスに存在する場合はネイティブ サポートを提供します。
たとえば、休止状態で動作するルーチンをライブラリに提供してほしいと考えています。ただし、休止状態のjarファイルが存在しない場合、アプリケーションがエラーで終了することは望ましくありません。
休止状態の jar をライブラリにバンドルすることなく、これを実装する方法はありますか?
初期化中に、Hibernate クラスの 1 つを検索するために使用できます。Class.forName
それが catch をスローし、ClassNotFoundException
Hibernate が環境にないことがわかっている場合は、フラグを設定して、Hibernate 固有の処理を実行しないようにします。
ただし、クラスのいずれかが Hibernate クラスを静的に (たとえば を介してimport
) 参照する場合、Hibernate がクラス パスにない場合、それらのクラスはロードされないことに注意してください。これに対処する通常の方法は次のとおりです。
HibernateStuff
。import
.HibernateStuffImpl
。そのクラスはimport
ものを休止させることができます。Class.forName
Hibernate が ( 経由で)クラスパスにあると判断したら、 を使用Class.forName
してロードし、HibernateStuffImpl
を使用Class#newInstance
してそのインスタンスを作成し、それを type の変数に割り当てますHibernateStuff
。HibernateStuffStub
クラスがあり、Hibernate がロードされていないときにそれを使用すると、コードに条件ステートメントが散らばることがありません。(JVM はノーオペレーション コールで非常に高速です。)...そしてもちろん、上記のすべては、Hibernate だけでなく、あらゆるものに当てはまります。