JBossAS上でJBossAOPを動作させる

これ、想像以上に苦労した。まずは本家サイトをと思い
JBoss AOP - JBoss Community
のドキュメントを参照。

でもそこには局所的な実現方法しか書いておらず、JBossAOPをstandaloneで動作させる方法すら分からず。。。
仕方がないのでWebで検索、半日かけてやっとこのページに辿り着いた。
Deploy AOP to jboss 5.1 |JBoss Developer
これを元にJBossAS上でJBossAOPを動作させることに成功した。


1)JBossAOPのダウンロード
JBoss AOP Downloads - JBoss Community
よりJBossAOPをダウンロードし、適当な場所に展開する。
※現時点の最新版は「2.1.8.GA」


2)JBossASの設定
jboss-aop-2.1.8.GA/lib/pluggable-instrumentor.jar」を「${JBOSS_HOME}/bin」にコピーする。
(※本当は「${JBOSS_HOME}/server//deployers/jboss-aop-jboss5.deployer/pluggable-instrumentor.jar」をコピーする方が良いと思う。)
その後、run.conf(Win系はrun.conf.bat)に以下を追記する。

JAVA_OPTS="$JAVA_OPTS -javaagent:pluggable-instrumentor.jar"

最後に「${JBOSS_HOME}/server//conf/bootstrap/aop.xml」を開き、

<property name="enableLoadtimeWeaving">true</property>

とする。


3)サンプルWARの作成&デプロイ
jboss-aop-2.1.8.GA/docs/aspect-framework/examples/injboss」のbuild-jboss5.xmlを編集してサンプルWARを作成&デプロイする。

まずは${JBOSS_HOME}を設定する。

<property environment="env" />
<property name="jboss.dir" value="${env.JBOSS_HOME}"/>

次にサーバコンフィグを設定する。

<property name="jboss.server.config" value="default" />

最後にクラスパスをちょいと修正する。(必要があれば)

<path id="jboss.classpath">
   <pathelement path="${jboss.dir}/common/lib/servlet-api.jar"/>
   <pathelement path="${jboss.dir}/lib/jboss-javaee.jar"/>
</path>

あとはantを実行するだけ。

ant -f build-jboss5.xml deploy-basic-lt-war

実行後、以下の2つがデプロイされる。


そして

http://localhost:8080/aopexample/

にアクセス。
これで動作すると思ったが・・・「java.lang.ClassNotFoundException: org.jboss.injbossaop.lib.SimpleInterceptor」が発生。
ん?なぜだ???と思い再度
Deploy AOP to jboss 5.1 |JBoss Developer
を見る。
どうやらAdvice用のクラスが参照できていないらしい。
そのため以下の手順を実施。


4)Advice用クラスのデプロイ
antを実行したディレクトリ直下の「output/lib/aopexamplelib.jar」を「${JBOSS_HOME}/server//deploy」にコピーする。


これで完成。再度

http://localhost:8080/aopexample/

にアクセスし、表示されたTextboxに適当な文字を入力して「送信」を押下。

JBossASのコンソールログを参照すると、

というログが出力されている。
「<<< Entering SimpleInterceptor」から「>>> Leaving SimpleInterceptor」がAOPで挿入された処理になる。



うん、うまくいった。