Glassfish 3.1.2 で実行されている Spring webapp があります。webapp を OSGi に変換し始めたところです。既存の Web アプリケーションをアンデプロイし、Spring および Gemini OSGi jar を Glassfish インストールの modules ディレクトリにコピーしました。次に、Glassfish OSGi Web コンソール (カスタマイズされた Felix Web コンソールの一種であると理解しています) を使用してそれらをインストールし、アクティブ化しましたが、すべて問題ありませんでした。何もしませんでしたが、テストしたかったWebコンソールにインストールしてアクティブ化できました。
次に、Glassfish アプリケーション コンソールを使用して既存の Web アプリケーションの非 OSGi jar を再デプロイし、2 種類の jar が共存できるかどうかを確認しました。この時点で、他のクラスの中でNoClassDefFoundErrors
見つけられないという不満が投げられ始めました。org.apache.commons.logging
これらのクラスは、インストールされた OSGi jar として Module ディレクトリとアプリケーション クラスパスの両方に存在していました。その後、コンソールで jar を非アクティブ化しましたが、OSGi jar は削除しませんでしたが、例外がスローされ続けました。
クラスローダーの出力を取得したところ、Web アプリケーションの jar ファイルWEB-INF
が読み込まれていないことがわかりましたが、これが問題なのか症状なのかはわかりませんでした。
次に、アンインストールされた OSGi jar から jar を削除すると、すべてが再び機能し始め、webapp をデプロイできました。
これが起こる理由を誰でも思いつくことができますか?モジュールディレクトリの内容はクラスパスにあると推測していますが、そうであればなぜですか? OSGi jar と非 OSGi jar を連携させたい場合、これが問題を引き起こすのをどのように防ぐことができますか?
サイドノート
- クラスローダーによってクラスがロードされているのを見たとき、モジュールフォルダーからコンテンツがロードされているのを確認できませんでした。
- 非 OSGi jar がデプロイされた後に OSGi jar をインストールしてアクティブ化できますが、その逆はできません。