開発環境

主にAspectJ開発環境の話です. AspectJのプログラミング言語としての話は別にしています.

コマンドラインから AspectJ を使う

まず,Java 2 実行環境をインストールしてください. AspectJ コンパイラは Java で書かれていますし, また生成されるコードは Java のバイトコードですので, Javaの実行環境が必要になります. Java 2 (JDK1.2以降) が動作する環境を用意してください.

AspectJ 公式サイトから AspectJコンパイラを格納した JAR ファイルがダウンロードできます. JAR ファイルをダブルクリックするか,コマンドプロンプトから

java -jar aspectj-xxx.jar 

というようにコマンド実行することで,インストーラが起動します. 標準では,C:\aspectj1.0 のようなディレクトリを作成し, その下の bin ディレクトリにコンパイラが,lib ディレクトリに ランタイムライブラリが配置されます.

環境変数の設定などはインストール時にインストーラが表示してくれるので, その指示に従います. 具体的にやることは,次の2つです.

  • 環境変数 CLASSPATH に,(アスペクトをインストールしたディレクトリ)/lib/aspectjrt.jar を追加します.
  • 環境変数 PATH に,(アスペクトをインストールしたディレクトリ)/bin を追加します.

コンパイル方法,オプション

AspectJ のコンパイラである ajc は,Java で記述された javac の上位互換コンパイラです.コマンドラインオプションのほとんどはそのまま javac で使われているもので, javac から簡単に移行することができます.

通常のコンパイル:
javac と同様に使うことができます.
ajc Foo.java

アスペクトを結合する場合:
アスペクトを記述したファイルを一緒にコンパイルします.
ajc Foo.java Bar.java HogeAspect.java

特定のクラスにはアスペクトを結合したくない場合:
そのクラスファイルだけを個別にコンパイルします.
ajc Foo.java HogeAspect.java; ajc Bar.java

アスペクトの織り込み結果をソース上で見る(AspectJ 1.0)

"-preprocess" オプションを使うと,作業ディレクトリ ajworkdir に アスペクトを織り込んだ結果のソースコードを保存してくれます.

ajc -preprocess Foo.java Bar.java HogeAspect.java

このオプションは,AspectJ 1.0 でしか使えませんが, アスペクトの記述がどのようなコードに展開されるかを知ることで AspectJ の理解を深めるために役立つ場合があります.

どこにアスペクトが結合されたか出力する (AspectJ 1.2.1)

この情報は AspectJ 1.2.1 のリリースノートに掲載されている例です. showWeaveInfo オプションを使うことで, どこにアスペクトが結合されているかを出力することができます.

C:\aspectj1.2.1\doc\examples\tjp>ajc -showWeaveInfo *.java

Type 'tjp.Demo' (Demo.java:20) advised by around advice from 'tjp.GetInfo' 
(GetInfo.java:26) [RuntimeTest=true]
Type 'tjp.Demo' (Demo.java:30) advised by around advice from 'tjp.GetInfo' 
(GetInfo.java:26) [RuntimeTest=true]
Type 'tjp.Demo' (Demo.java:34) advised by around advice from 'tjp.GetInfo'
(GetInfo.java:26) [RuntimeTest=true]

http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/README-121.html

この情報は,初めてアスペクトを作って結合してみる際には, その定義が正しいかどうかをチェックする際の助けになる可能性があります. 大規模なシステムが相手になってくると,この出力結果を調べることも 容易ではないかもしれません.

Eclipse での AspectJ 開発

Eclipse は, open source な Java 統合開発環境です. Java で書かれており,Java クラスで簡単にプラグインを追加することができます. AspectJ に対しても, AJDT (AspectJ Developemnt Tools) という プラグインが公開されており,どこにアスペクトが貼りつくか, といった情報を見ながらコーディング作業を進めることができます.

Eclipse については, Eclipse Wikiなどの日本語情報サイト, ニュースサイトでも紹介されています.

AJDT プラグインは,AspectJ の入力支援付きエディタの使用, プログラムのコンパイル, Java デバッガを使った デバッグ作業などを行うことができます.

Eclipse 3.0 上でのインストール法:
http://sel.ist.osaka-u.ac.jp/~ishio/ajdt-install/

Eclipse 2.1 上でのインストールなど:
http://sel.ist.osaka-u.ac.jp/~ishio/sd2004/ajdt_install.html

developerWorks に Eclipse 3.0 + AJDT の使い方に関する情報が掲載されています.
http://www-6.ibm.com/jp/developerworks/java/041126/j_j-ajdt.html

Java 開発環境に慣れている人向けの注意

Eclipse 上の AspectJ の開発環境は,Java 開発環境にほんの少しの改変を加えただけなので,スムーズに移行することができるようになっています. しかし,よく似ているがために,以下のような差異には注意が必要です.

  • 自動コンパイルに対応していない.
    • インクリメンタルコンパイルはまだ不完全で,手でコンパイルする(CTRL+Bでの「すべてビルド」を実行する)のが確実です.Java の開発で,ファイルを保存→実行という流れになれてしまうと,再コンパイルをつい忘れがちになってしまうので,注意してください.
  • Java の検索ツールなどが .aj ファイルを検索対象としない.
    • Java 開発環境では,メソッド名やクラス名を右クリックして「定義」「参照」を検索してくる,ということができますが,AspectJ のソースコードである .aj ファイルに対しては,これらの検索機能が有効ではないようです(単なるテキスト検索は有効です).このため,検索の結果を見て,「このメソッドは,このクラスからしか呼ばれていないはずなのに……」と思っていたら,アスペクトからも実は使われていた,といった落とし穴にはまる可能性があります.

エディタ

エディタには,アスペクトが動作する位置をマーカー表示するなどの 支援機能があります.ただし,Java における構文チェック (誤りの位置に下線を引く)機能が AspectJ の構文に対して正しく働きません. AspectJ Team では,この機能をオフにするよう推奨しています.

コンパイル

AspectJ では,ソースコードを同時にコンパイルした相手に対してのみ アスペクトの結合を行います.そのため,Java 開発環境における 「ファイルを保存した時点で自動コンパイル」という機能が働きません.

デバッガ

デバッガの機能は一部制限されています. 主な制限は, Eclipse が,デバッグ中のバイトコードから, 元のソースコードを発見できないために生じています. アスペクトが,他のクラスの内容を書き換えるため,デバッグ対象の バイトコードと同名のファイルを探しただけではソースコードの対応が取れません.

(AspectJ 1.5 に対応した AJDT では) アスペクトのソースコードに対するステップ実行なども可能ですが, インタータイプ宣言されたメソッドへの step in のタイミングなどで, ソース上の文と対応しない位置(ファイルの1行目など)に飛んでしまうことがあります.

(AspectJ 1.5 より前の古い情報) この影響で,アスペクトのソースコード中にはブレークポイントを 設置することはできず,また,アスペクトのコードをステップ実行する時には 現在の実行位置が表示されません.

スタックトレース上の情報を参照して,現在の実行位置を把握してください.

AJDT 1.1.4 でのデバッガ

AJDT 1.1.4 などでは,AspectJ によって生成されたバイトコードは, method_aroundBody1$adviceのように特殊なシグネチャを持ちます. このシグネチャから,AspectJ のコードであることは分かり, 行番号もアスペクト中の正しい行番号を指しています.

しかし,アスペクトのコードは,クラスの中に展開されているため, Eclipse はクラスのソースファイル上で,アスペクトのソース行番号に カーソルを移動してしまいます.カーソル位置は信用できないということだけ 記憶してデバッグ作業を行う必要があります.

AJDT 1.1.10 以降のデバッガ

AJDT 1.1.10 では,アスペクトによって生成されたコードに対しては, 元のクラスのソースコードでは存在しないような位置に行番号をずらします. たとえば,アスペクトのソースコード上で14行目を実行しているときは (クラスが100行以下なら),114という数字を割り当てることで アスペクトを実行中であることを明示し, 現在の実行位置を示すカーソルが誤った位置に移動することを防いでいます.

その他,AJDT プラグインを使う際の注意点について, 大学院の授業で使用した際の経験に基づく資料を Eclipse を 用いた AspectJ プログラミングにおける注意と称して公開していますので, 参考にしてください.

http://sel.ist.osaka-u.ac.jp/~ishio/sd2004/

Eclipse と開発プラグイン AJDT の対応関係

  • Eclipse 2.1: AJDT 1.1.4
  • Eclipse 3.0M8〜M9: から使う場合は,AJDT 1.1.10
  • Eclipse 3.0: AJDT 1.1.12

Eclipse 3.0 ではインストール/更新パースペクティブではなくアップデート専用メニューが追加されたこと,ダウンロード先のサイトが変更になったことなどが異なりますが,インストール方法なども特に変化はありません. Eclipse に関する説明も参照してください.

ツールのバージョンごとの違い

AJDT 1.1.10 以降,使いやすさは少しずつ改善されているようです. たとえば,インストール後,Java エディタの警告(下線によるエラーの指摘)を オフにするなどの設定を自動で行うことができます.

しかし,全体として,ツールの機能そのものに大きな変更はないようです.

AspectJ 以外のアスペクト指向の環境

AspectJ タイプの手法

AspectC, AspectC++

URL が .net と .org の違いだけでまぎらわしいですが, AspectC(http://www.aspectc.net/ )と AspectC++(http://www.aspectc.org/ )は, それぞれ C と C++ を対象にしたプロジェクトです. 基本的なアプローチは AspectJ と同様です.

.NET 関連

AspectJ が提供しているのと同種の機能を .NET の CLR 上で実現しようというアプローチがいくつも試みられています.

以下のURLに,どこのプロジェクトがどのくらい進んでるかという情報が載っていました.

http://janus.cs.utwente.nl:8000/twiki/bin/view/AOSDNET/CharacterizationOfExistingApproaches

一般的な商用ソフトウェアの開発に使えるレベルなのかどうかは分かりませんが, 次のプロジェクトなどは頑張っているように見えます.

コンテナ,フレームワークが提供するAOP

JBoss AOP や,Seasar2 の DI コンテナの AOP 機能がこれに該当します. アスペクトとして実行したい処理をあらかじめ独立した "インターセプタ" として 実装しておき,フレームワーク側に 「いつそのインターセプタを実行してほしいか」という pointcut 情報を書いた 設定ファイルを渡すことで,アスペクトの実行をフレームワーク側に任せる方法です.

Fluid AOP

これは研究段階のアプローチです.

Fluid AOP は上記のようなアプローチと異なり, 開発者が取り扱いたいアスペクトを指定したら, 開発環境がそれに対応するコード群を一時的に1つのモジュールに 見せかけて開発者に提示し, その関心事の変更をサポートするというものです. AOP のための機能を言語処理系ではなく開発環境に持たせているので, AOP の利点を通常のプログラミング言語でも使える可能性があります.

2007年2月の時点では開発ツールとしては公開されていません.


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-05-01 (火) 21:21:01 (4165d)