作成 2004/9/16
ひさびさにWebLogicを使いました。デプロイやデバッグは簡単に行いたいっすよね。
試した環境
昔JBossを使ったとき、「ディレクトリにEJB-JARやWARを置いただけで、デプロイが実行される」というのに衝撃を受けた記憶がありますが、WebLogicでもけっこう前から(?)そういう機能があります。デプロイ用のディレクトリにアーカイブしたファイルをコピーすればデプロイ完了です。例えば、ウィザードを利用してハイハイすすめてサーバを構築した場合は、C:\bea\user_projects\domains\mydomain\applications が簡易デプロイディレクトリです。
JSPの開発では、ちょっとした修正をするたびにイチイチWARやEARにパッケージングして、デプロイするのは時間もかかるし手間です。WebLogicでは「分割開発ディレクトリ」という機能を利用して、迅速なJ2EEアプリケーションの開発が可能です。
参考
http://edocs.beasys.co.jp/e-docs/wls/docs81/programming/environment.html#1097239
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9438&forum=12&8
方法はけっこう単純で、例えば、hoge.earというアーカイブを作る代わりに、hoge.earというディレクトリを作成します。このディレクトリの下にEAR形式でファイルを配置します。そして、このhoge.earディレクトリをWebLogicにデプロイすればいいだけです。WARやEJB-JARも同様です。
EARのディレクトリ構造の例
ディレクトリのデプロイは管理コンソールから可能です
Eclipseなどでは、ソースフォルダごとに出力ディレクトリを指定できるので、EJB、WARごとにクラス出力先を指定するとよいでしょう。正式なEARを作るビルドは別途Antなどで記述します。EARのディレクトリ構造に置いているので、Antビルドファイルの記述も簡単です。
WebLogicではEAR直下のAPP-INF/lib、APP-INF/classesに各モジュールから利用する共通のJARやクラスを配置できます。じゃあ、APP-INF/classesに全部つっこんじゃえばいいか?と思ったらそれはダメです。WebLogicのクラスローダはWebアプリ上のクラスから取得すると、以下のような階層になっています(下が親ローダー)。こんな感じで確認できます。
weblogic.utils.classloaders.ChangeAwareClassLoader(app@hello) ←Webアプリのクラスローダ@ weblogic.utils.classloaders.GenericClassLoader(app@) ←EAR共通クラスローダA weblogic.utils.classloaders.GenericClassLoader sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader
APP-INF以下においたものはAのローダーで読まれます。対してWebアプリのブツ(WEB-INF/lib以下のJARなど)は、@のローダーで読まれます。なので、APP-INF/classes以下のクラスからは、WEB-INF/lib以下のJARが読めません。なので、横着せずに、WebアプリのクラスはちゃんとWebアプリの中に置いた方がよいでしょう。EJBのクラスも適当に配置すると、ObjectNotFoundExceptionやら謎のエラーが出ることがあるのと、一応コンポーネントでもあるので、相互の依存はなるべく避け、コンポーネント内で完結する作りにした方がよいでしょう。
今回作ったサンプル。Eclipseプロジェクト。重いのでJARはぬいてます。
wlsample.zip
Eclipseからサーバの起動構成を作成し、ソースデバッグを行うことが可能ですが、リモートデバッグを利用することでもデバッグが可能です。やり方は以下のページをどうぞ。
http://www.eclipsewiki.net/eclipse/?%A5%EA%A5%E2%A1%BC%A5%C8%A5%C7%A5%D0%A5%C3%A5%B0#content_1_1