6

我无法理解 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>

编译测试项目

<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 使用注解样式,那么您可以使用 javac 编译它们,只要创建了正确的 aop.xml,weaver 在运行时可用。

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

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

或者,如果您使用的是 LTW,那么您不需要将您的添加TestProject到任何 inpath 中,您可以使用 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

于 2011-04-04T16:21:24.107 回答