主な質問
私がやりたいことはかなり簡単です。またはそう思うでしょう。ただし、何も正しく機能していません。
要件: Maven を使用し、AspectJ コンパイラを使用して Java 1.6 プロジェクトをコンパイルします。
注: この コードは javac でコンパイルできません。つまり、アスペクトが織り込まれていない場合はコンパイルに失敗します (例外を緩和するアスペクトがあるため)。
2011 年 2月 21 日更新: これには 2 つの同等に実行可能な解決策があります (どちらの場合も、 maven-compiler-pluginと一緒にaspectj-maven-pluginを使用します)。
<failOnError>false</failOnError>
コンパイラプラグイン に追加 ( Pascal Thiventに感謝)<phase>process-sources</phase>
spectj コンパイラ プラグインに追加( Andrew Swanに感謝)
これらのソリューションの詳細については、回答セクションを参照してください。解決策 2 の方が優れていると思います。
関連する質問
質問 (以下の試行の失敗に基づく):
- compile:compile を実行せずに、maven に直接、aspectj:compile ゴールを実行させるにはどうすればよいですか?
- compile:compile の失敗をどのように無視しますか?
- 独自の ajc コンパイラを指すカスタムの compilerId をどのように指定しますか?
試行 1 (失敗): maven-compiler-plugin のコンパイラとして、aspectJ を指定します。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerId>aspectj</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-aspectj</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</plugin>
これはエラーで失敗します:
org.codehaus.plexus.compiler.CompilerException: The source version was not recognized: 1.6
使用している神経叢コンパイラのバージョン (1.8、1.6、1.3 など) に関係なく、これは機能しません。ソースコードを実際に読んだところ、このコンパイラは Java 1.5 より上のソースコードを好まないことがわかりました。
試行 2 (失敗): compile および test-compile ゴールにアタッチされたspectJ-maven-plugin を使用します。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
これは、次のいずれかを実行すると失敗します。
mvn clean test-compile
mvn clean compile
これは、aspectj:compile を実行する前に compile:compile を実行しようとするためです。上記のように、コードは javac でコンパイルされません。アスペクトが必要です。したがって、mvn は compile:compile ゴールを完全にスキップし、aspectj:compile のみを実行する必要があります。
試行 3 (動作しますが受け入れられません):
上記と同じ構成を使用しますが、代わりに次を実行します。
mvn clean aspectj:compile
これは正常にビルドされるという点では機能しますが、コンパイル ゴールとテスト コンパイル ゴールを直接実行できる必要があるという点では受け入れられません (m2eclipse の自動ビルドはこれらのゴールに依存します)。さらに、この方法で実行するには、途中で必要なすべての目標を詳しく説明する必要があります (たとえば、リソースを配布し、テストを実行し、リソースをデプロイする必要があります)。