LoginSignup
4
5

More than 5 years have passed since last update.

【opensaml】Tomcat→weblogicに移行したらNoClassDefFoundErrorが発生

Posted at

opensamlライブラリを使用してSAML認証を行うプログラムを作成し、
Tomcat環境で動作確認後weblogicサーバーにデプロイした所NoClassDefFoundErrorが発生。
javaのバージョンは6。
opsensamlのバージョンは2.6.6。

ググってみたら同様の事象が下記に記載されていました。

https://stackoverflow.com/questions/30227152/opensaml-throws-java-lang-noclassdeffounderror-only-on-weblogic

上記に下記ライブラリを削除したらとりあえず動くと書いてあったのでこちらのサーバー上でも同じことを試してみたら確かにうまく動作しました。
・com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0
・com.bea.core.bea.opensaml_1.0.0.0_6-1-0-0

反対に上記のライブラリをTomcat環境に配置して動作させてみたところweblogic環境と同じエラーが発生。

上記結果からライブラリのロード順の問題の線で調査した所、下記にそれっぽいことが記載されてました。

http://otndnld.oracle.co.jp/document/products/wls/docs92/programming/classloading.html#wp1082452

どうやらweblogicはアプリで配置したライブラリのディレクトリ(~/WEB-INF/lib/)に優先して
ロードするライブラリのディレクトリがあり、今回はそちらに存在する上記opensamlにこちらで配置したアプリから呼んでいるopensamlのクラスが無いためエラーが発生した模様。

なのでこちらで配置したopensamlライブラリを優先できないか調べた所、weblogic.xmlに[prefer-application-packages]タグで優先したいパッケージ名を指定することで可能とのことだったので該当タグをweblogic.xml追記したところ問題解決しました(下記ドキュメントを参照しました)。

https://docs.oracle.com/cd/E72987_01/wls/WLPRG/classloading.htm
https://docs.oracle.com/cd/E28613_01/web.1211/b65890/weblogic_xml.htm

以下、追記した内容になります。

    <prefer-web-inf-classes>false</prefer-web-inf-classes>
    <prefer-application-packages>
       <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>

prefer-application-packagesタグを使用する場合はprefer-web-inf-classesタグにfalseを指定することが必要の様です。ちなみにアプリで配置したライブラリ全てを優先してロードさせたい場合はprefer-web-inf-classesタグにtrueを指定するとよいみたい。

http://otndnld.oracle.co.jp/document/products/wls/docs92/webapp/weblogic_xml.html

xmlの全文は下記の通り。

weblogic.xml
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">
  <session-descriptor></session-descriptor>
  <jsp-descriptor></jsp-descriptor>
  <container-descriptor>
    <prefer-web-inf-classes>false</prefer-web-inf-classes>
    <prefer-application-packages>
       <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>
 </container-descriptor>
   <context-root>/</context-root>
   <wl-dispatch-policy>******</wl-dispatch-policy>
 </weblogic-web-app>

もしかしたら同じ問題がまた出るかもしれないので残しとこーっと。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5