これは大きな問題です。
私は、基本的なモジュラーアーキテクチャを備えた、適切に構造化されたモノリシックコードベースを持っています(すべてのモジュールはインターフェイスを実装しますが、同じクラスパスを共有します)。このアプローチの愚かさと、ライブラリのバージョンが競合している可能性のあるアプリケーションサーバーにデプロイするときに発生する問題を認識しています。
私は現在約30個の瓶に依存しており、それらを束ねていますが途中です。これで、ネットワークコンポーネントなど、一部のモジュールはバージョン管理された依存関係を簡単に宣言できます。これらは、JREおよびその他のBNDdedライブラリ内のクラスを静的に参照しますが、JVM関連のコンポーネントはClass.forName(...)を介してインスタンス化され、任意の数のドライバーの1つを使用できます。
私はすべてをサービスエリアごとにOSGiバンドルに分割しています。
- 私のコアクラス/インターフェース。
- 関連するコンポーネントのレポート。
- データベースアクセス関連コンポーネント(JDBC経由)。
- 等....
私のコードが、すべての依存関係を持つ単一のjarファイルを介してOSGiなしで、OSGiなしで(JARJARを介して)引き続き使用できるようにし、OSGiメタデータと依存関係情報を含む詳細なバンドルを介してモジュール化できるようにしたいと思います。
クラスパス上および/またはOSGiコンテナー環境(Felix / Equinoxなど)内で任意のドライバーを動的に利用できるように、バンドルとコードを構成するにはどうすればよいですか?
コンテナー間で互換性のあるOSGiコンテナー(Felix / Equinoxなど)で実行されているかどうかを検出する実行時の方法はありますか?
OSGiコンテナーにいる場合、別のクラス・ロード・メカニズムを使用する必要がありますか?
データベースモジュールを介してバンドル時に不明なJDBCドライバーをロードできるようにするには、OSGiクラスをプロジェクトにインポートする必要がありますか?
ドライバーを取得する2番目の方法もあります(JNDIを介して、アプリサーバーで実行している場合にのみ実際に適用できます)。OSGi対応アプリサーバーのJNDIアクセスコードを変更する必要がありますか?