事象 サーバー起動時にWebアプリケーションの起動に失敗する
WebLogic14cをはじめて使った中でドハマリしたので、備忘録です。
過去にWebLogic11g、12cは使用したことがあります。
Spring5.3でWebアプリケーションを実装し、WebLogic14cへデプロイした際にこんなエラーに遭遇してしまいました。
javax.faces.FacesException: Unable to find CDI BeanManager
原因① JSFライブラリが不足していた
エラーの内容についていろいろと調べてみると、JSFライブラリが関連することがわかりました。
アプリケーション側でJSFライブラリは使用していないので、APサーバー側の依存によるものだと思います。
はじめはWebLogicに内包されているJSFライブラリではなく、Mavenセントラルリポジトリに公開されているものを使用してデプロイしたのですが、以下のような別のエラーに遭遇しました。
java.lang.ClassCastException: class com.sun.faces.vendor.WebContainerInjectionProvider cannot be cast to class com.sun.faces.spi.InjectionProvider
WebLogicのドキュメントを確認したところ、内包されているJSFライブラリをデプロイ・参照できるように設定する必要がありそうでした。
そのため、内包されているJSFライブラリ以外はWebLogicに対する互換性がないのでは?と考えました。
原因② weblogic.xmlに記載のクラスローダーの読み込み順序設定に問題があった
weblogic.xmlではクラスローダーの読み込み順序を設定して制御することができるのですが、今回の場合ではこの設定がうまくできていませんでした。
具体的には以下のような設定をして、デプロイしたWebアプリケーションを優先して読み込むようにしていました。
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
対処① WebLogicに内包されたJSFライブラリをデプロイ
内包されているライブラリは${weblogic_home}\wlserver\modules
に配置されていて、その中のglassfish.jsf.jar
を使用します。
このファイルをコピーして以下のディレクトリに配置する必要があります。
${weblogic_home}\user_projects\domains\${domain_name}\lib
ドメインディレクトリごとのlibフォルダに配置することで、サーバー起動時にデプロイされるようになります。
また、上記で配置した内包されているもの以外でJSFライブラリ(javax.faces~.jar
等)がデプロイすると重複してエラーになるため注意が必要です。
※${weblogic_home}
はWebLogicのインストールディレクトリ、${domain_name}
はドメインごとのディレクトリとして適宜読み替えてください
対処② JSFライブラリが優先して読み込まれるようにクラスローダーの読み込み順序設定を変更
原因②のwls:prefer-web-inf-classes
はデフォルトがfalseのため、削除します。
以下のようにパッケージ名を指定する形でクラスローダーの読み込み順序を設定し、JSFライブラリが優先して読み込まれるようにします。
<prefer-application-packages>
<package-name>javax.faces.*</package-name>
<package-name>com.sun.faces.*</package-name>
<package-name>com.bea.faces.*</package-name>
</prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>javax.faces.*</wls:resource-name>
<wls:resource-name>com.sun.faces.*</wls:resource-name>
<wls:resource-name>com.bea.faces.*</wls:resource-name>
<wls:resource-name>META-INF/services/com.sun.faces.*</wls:resource-name>
</wls:prefer-application-resources>
総括
対処①・②を行うことで問題なくデプロイおよびアプリケーションの起動が成功するようになりました。
この件に限らずサーバー依存の問題は解決するまでに結構ヒヤヒヤしますね。
WebLogic14c自体の情報が意外と少なくて、調べるのに少し苦労したのでお困りの方の参考になれば幸いです。
追記
根本原因としてはWebLogicのバグだったことがわかりました。
https://support.oracle.com/knowledge/Middleware/2785976_1.html
Oracleサポートアカウントをお持ちの方は、パッチを適用することでエラーが解消されるようです。
参考