AspectJ - 编译时与加载时编织

时间:2011-04-01 17:46:50

标签: aspectj compile-time-weaving load-time-weaving

我无法理解aspectJ的编译时和加载时编织以及弄清楚要使用什么(以及如何使用ajc)来编译和构建我的项目。

这是我的项目结构: -

  • TestProject:一个ja​​va服务库。 其他一些人正在使用它 项目。此项目不包含 任何方面。

  • TestProject-Aspects:仅包含
    建议几个班级的方面 TestProject。我没有使用 AspectJ5的注释风格和我的全部 连接点只是方法
    目前执行。

我的问题:

  • ajc vs 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?

1 个答案:

答案 0 :(得分:5)

ajc和iajc是Eclipse附带的JDT编译器的扩展。因此,ajc和iajc将为Eclipse生成与纯Java完全相同的字节代码(其中包含与Oracle的javac的一些细微差别)。

ajc和iajc基本相同,只是iajc是增量的(这是iajc中的 i )。这意味着编译器会检查时间戳,并在可能的情况下执行更智能的增量构建,并避免完全构建(就像在eclipse中使用AJDT时一样)。除了这个功能,它们基本相同。有关更多信息,请参见此处:

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

如果项目不包含任何方面,则使用ajc编译器是可选的。这些项目可以位于包含方面的项目的inpath中。要编译包含代码样式方面的内容,则需要使用ajc。

注释风格方面略有不同。如果您只为LTW使用注释样式,那么只要创建了正确的aop.xml,就可以使用javac进行编译,weaver在运行时可用。

但是,使用CTW编织的注释样式确实需要ajc。

在上面的特定情况下,您可以使用javac编译TestProject,只要它位于Aspect项目的inpath中即可。这意味着您的TestProject的类文件将被重写并与您的方面项目中的类文件组合。

或者,如果您使用的是LTW,那么您不需要将TestProject添加到任何路径中,您可以使用javac。但是,您必须在运行时为LTW设置应用程序。


修改

要回答以下评论:

是。您可以先使用ajc或iajc任务编译方面项目。然后,您还可以使用iajc任务编译第二个纯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