以前の記事で AspectJ プロジェクトの POM ファイル(の雛形)を書きましたが、少々不具合(っぽいもの)があったのでご報告。
問題
aspectj プラグインの設定をしている箇所(/project/build/plugins/plugin)が
<project> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> </project>
となってましたが、この設定だと、プロジェクトをビルドする際、織り込みが2度(main コードのコンパイル時と test コードのコンパイル時)行われてしまうようです*1。
解決策
大抵の場合、「test-compile」ゴールを実行しないようにすれば解決すると思います:
<project> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </project>
この方法が適用できないのは、Maven2 の「test フェーズ」で行うテストにアスペクトが含まれている場合です。 この場合は、main コード用、test コード用の「.ajproperties」ファイルを書くと解決するかと・・・→
Eclipse の AspectJ プロジェクトで開発する場合について。 Eclipse 上ではテスト・コード内(「src/test/java」フォルダ下)のアスペクトもメイン・コード内(「src/main/java」フォルダ下)のクラスに織り込まれるので、テストは Eclipse 上でのみ行い、Maven2 のビルド・プロセスではテストをスキップ(→)しておくと良いかと。 ただし、Maven2 のビルド・プロセスでは「clean」をするのを忘れずに。 例えば成果物をローカル・リポジトリにインストールする場合は以下のようにします:
mvn clean install
*1:aspectj-maven-plugin の使い方を見ると、main コード、test コードのコンパイル時にはそれぞれ、 main コード中、test コード中のアスペクトを織り込むことになっていますが、実際には main コード中のアスペクトは2度織り込まれているようです。 test コード中のものは確かめていません。