倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

AspectJ プロジェクトの POM ファイルへの修正

以前の記事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」ファイルを書くと解決するかと・・・

EclipseAspectJ プロジェクトで開発する場合について。 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 コード中のものは確かめていません。