6

私は、プロジェクトをコンパイルしてビルドするために、aspectJ のコンパイル時とロード時の織り方を理解し、何を使用するか (および ajc を使用する方法) を理解するのに苦労しています。

これが私のプロジェクト構造です:-

  • TestProject : Java サービス ライブラリ。これは、他のいくつかのプロジェクトで使用されています。このプロジェクトにはアスペクトが含まれていません。

  • TestProject-Aspects : TestProject
    のいくつかのクラスにアドバイスするアスペクトのみが含まれます。私は
    AspectJ5 アノテーション スタイルを使用しておらず、すべてのジョインポイントは現在メソッドの
    実行中です。

私の質問:

  • ajc と iajc の違いは?
  • 織る必要はありますか?

  • このようなものは機能しますか?

TestProject-Aspects のコンパイル

<iajc>
    sourceroots=${sources.dir}
    destdir=${classes.dir}
    classpath=${standard.compile.classpath}
</iajc>

TestProject のコンパイル

<iajc>
    sourceroots=${sources.dir}
    destdir=${classes.dir}
    classpath=${standard.compile.classpath}
    inpath=${[TestProject-Aspects]pkg.classpath}
</iajc>
  • javac をまったく使用する必要はありませんか? TestProjectをコンパイルするために最初に使用していたものはどれですか?
4

1 に答える 1

5

ajc および iajc は、Eclipse に付属する JDT コンパイラーの拡張機能です。したがって、ajc と iajc は、純粋な Java に対して Eclipse とまったく同じバイト コードを生成します (これには、Oracle の javac との小さな違いがいくつか含まれています)。

ajc と iajc は基本的に同じですが、iajc はインクリメンタルです (iajc のiです)。これは、コンパイラがタイムスタンプをチェックし、可能であればよりスマートなインクリメンタル ビルドを実行し、フル ビルドを回避することを意味します (Eclipse 内で AJDT を使用する場合と同様)。この機能以外は、基本的に同じです。詳細については、こちらを参照してください。

http://www.eclipse.org/aspectj/doc/released/devguide/antTasks-iajc.html

プロジェクトにアスペクトが含まれていない場合、ajc コンパイラの使用はオプションです。これらのプロジェクトは、アスペクトを含むプロジェクトのインパス上にある可能性があります。コード スタイルの側面を含むものをコンパイルするには、ajc を使用する必要があります。

注釈スタイルの側面は少し異なります。LTW のみに注釈スタイルを使用している場合は、適切な aop.xml が作成されている限り、javac を使用してそれらをコンパイルできます。ウィーバーは実行時に使用できます。

ただし、CTW ウィービングを使用したアノテーション スタイルには ajc が必要です。

TestProject上記の特定のケースでは、アスペクト プロジェクトの inpath にある限り、javac を使用してコンパイルできます。これは、TestProject のクラス ファイルが書き直され、アスペクト プロジェクトのクラス ファイルと結合されることを意味します。

または、LTW を使用している場合は、inpath に追加する必要はなく、TestProjectjavac を使用できます。ただし、実行時にアプリケーションを LTW 用に設定する必要があります。


編集

以下のコメントに答えるには:

はい。ajc または iajc タスクを使用して、最初にアスペクト プロジェクトをコンパイルできます。次に、iajc タスクを使用し、さらに最初のプロジェクトの結果をアスペクト パスに置くことで、2 番目の純粋な Java プロジェクトをコンパイルできます。これには javac を使用できません。

ant build.xml スニペットは次のようになります。

<project name="simple-example" default="compile" >
  <taskdef 
      resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
    <classpath>
      <pathelement location="${home.dir}/tools/aspectj/lib/aspectjtools.jar"/>
    </classpath>
  </taskdef>

  <target name="compile" >
    <iajc sourceroots="${home.dir}/TestProject-Aspects/src" 
        classpath="${home.dir}/tools/aspectj/lib/aspectjrt.jar"
        destDir="${home.dir}/TestProject-Aspects/bin"/> 
    <iajc sourceroots="${home.dir}/TestProject/src" 
        classpath="${home.dir}/tools/aspectj/lib/aspectjrt.jar"
        destDir="${home.dir}/TestProject/bin"
        aspectPath="${home.dir}/TestProject-Aspects/bin"/> 
  </target>
</project>

の詳細については、こちらを参照してくださいiajc

http://www.eclipse.org/aspectj/doc/released/devguide/antTasks-iajc.html

于 2011-04-04T16:21:24.107 に答える