21

主な質問

私がやりたいことはかなり簡単です。またはそう思うでしょう。ただし、何も正しく機能していません。

要件: Maven を使用し、AspectJ コンパイラを使用して Java 1.6 プロジェクトをコンパイルします。

注: この コードは javac でコンパイルできません。つまり、アスペクトが織り込まれていない場合はコンパイルに失敗します (例外を緩和するアスペクトがあるため)。


2011 年 2月 21 日更新: これには 2 つの同等に実行可能な解決策があります (どちらの場合も、 maven-compiler-pluginと一緒にaspectj-maven-pluginを使用します)。

  1. <failOnError>false</failOnError> コンパイラプラグイン に追加 ( Pascal Thiventに感謝)
  2. <phase>process-sources</phase> spectj コンパイラ プラグインに追加( Andrew Swanに感謝)

これらのソリューションの詳細については、回答セクションを参照してください。解決策 2 の方が優れていると思います。







関連する質問

質問 (以下の試行の失敗に基づく):

  1. compile:compile を実行せずに、maven に直接、aspectj:compile ゴールを実行させるにはどうすればよいですか?
  2. compile:compile の失敗をどのように無視しますか?
  3. 独自の 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 の自動ビルドはこれらのゴールに依存します)。さらに、この方法で実行するには、途中で必要なすべての目標を詳しく説明する必要があります (たとえば、リソースを配布し、テストを実行し、リソースをデプロイする必要があります)。

4

4 に答える 4

16

AspectJプラグインのバージョン1.3は、コンパイル目標のデフォルトフェーズを意図的にからに変更しましたprocess-sources。MASPECTJ -13compileを参照してください。これにより、あなたやMASPECTJ-92のようなフォローアップの問題が発生します。javacの前にajcを実行する以前の動作を復元するには、次のように、関連する「execution」タグに「phase」タグを追加する必要があります。

<execution>
    <phase>process-sources</phase> <!-- or any phase before compile -->
    <goals>
        <goal>compile</goal>
        <goal>test-compile</goal>
    </goals>
</execution>
于 2011-02-18T05:43:26.887 に答える
4

すべての *.java ファイルをスキップし、aspectj-maven-plugin に仕事をさせるように maven-compiler-plugin に指示するのはどうですか?

...
<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.0.2</version>
      <configuration>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </configuration>
    </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>
        <encoding>utf-8</encoding>
        <complianceLevel>1.6</complianceLevel>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>       <!-- weave main classes -->
            <goal>test-compile</goal>  <!-- weave test classes -->
          </goals>
        </execution>
       </executions>
    </plugin>
  </plugins>
</build>
于 2010-06-29T16:26:54.437 に答える
2

プロジェクトでこの構成を使用して、Maven を使用して AspectJ と Java 6 をコンパイルしました。

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.8</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.3</version>
            <configuration>
                <complianceLevel>1.6</complianceLevel>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>  
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

参照:aspectj-maven-plugin

于 2010-04-09T21:39:54.910 に答える
1

独自の ajc コンパイラを指すカスタムの compilerId をどのように指定しますか?

「公式」compilerId以外を指定する方法がわかりません。それが可能かどうかはわかりません。

私の理解では、http://jira.codehaus.org/browse/MCOMPILER-107で問題が解決します (AspectJ 1.6+ は Java 1.6 をサポートしていますよね?)。残念ながら、まだ開いています。

compile:compile の失敗をどのように無視しますか?

Maven Compiler プラグインcompiler:compile目的には、コンパイル エラーが発生した場合でもビルドを続行するかどうかを示すオプションのパラメーターがあります。failOnError

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <failOnError>false</failOnError>
          ...
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

これは、上記の問題に対する醜い回避策になる可能性があります。

compile:compile を実行せずに、aspectj:compile ゴールを直接実行するように maven を取得するにはどうすればよいですか?

問題はcompiler:compile、フェーズにバインドされており、デフォルトのライフサイクル バインディングcompileを削除できないことです。したがって、おそらく別のオプションがありますが、私が考えることができる唯一の方法は、 a を使用してすべてをオフにし、すべての目標を手動で再バインドすることです (少なくともこれらのフェーズ: 、、、、、)。概略的には、次のようなものです。<packaging>pom<packaging>process-resourcescompileprocess-test-resourcestest-compiletestpackage

プロセス リソース リソース:リソース
アスペクトをコンパイルj:コンパイル
プロセス テスト リソース リソース:testResources
テストコンパイルコンパイラ:testCompile
確実なテスト:テスト
パッケージ ejb:ejb または ejb3:ejb3 または jar:jar または par:par または rar:rar または war:war
インストール インストール:インストール
展開 展開:展開

それは別の醜い回避策になる可能性があります。免責事項: テストされていませんが、動作するはずです。

于 2010-04-09T21:08:07.947 に答える