AspectJ - 编译时与加载时编织

发布于 2024-10-30 08:05:52 字数 855 浏览 1 评论 0原文

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

这是我的项目结构:-

  • TestProject :一个 java 服务库。 这正被其他一些人使用 项目。该项目不包含 任何方面。

  • TestProject-Aspects:仅包含
    为一些课程提供建议的方面 测试项目。我没有使用
    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 吗? 我最初用它来编译 测试项目?

I am having trouble understanding aspectJ's compile-time and load-time weaving and figuring out what to use(and how to use ajc) to compile and build my project.

Here's my project structure:-

  • TestProject : a java service library.
    This is being used by a few other
    projects. This project do not contain
    any aspects.

  • TestProject-Aspects : Contains just
    aspects which advice a few classes in
    TestProject. I am not using the
    AspectJ5 annotation style and all my
    joinpoints are just at the method
    execution currently.

My questions:

  • ajc vs iajc and how are they
    different?
  • Is there any need for weaving?

  • Will something like this work ?

Compile TestProject-Aspects

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

Compile TestProject

<iajc>
    sourceroots=${sources.dir}
    destdir=${classes.dir}
    classpath=${standard.compile.classpath}
    inpath=${[TestProject-Aspects]pkg.classpath}
</iajc>
  • Don't I have to use javac at all ?
    which I was initially using to compile
    TestProject?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

慢慢从新开始 2024-11-06 08:05:52

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,weaver 在运行时可用,您就可以使用 javac 来编译它们。

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

在上面的特定情况下,您可以使用 javac 编译 TestProject,只要它位于方面项目的 inpath 上即可。这意味着您的 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

ajc and iajc are extensions of the JDT compiler that comes with Eclipse. So, ajc and iajc will produce exactly the same byte code for pure Java as Eclipse would (which contains some minor differences to Oracle's javac).

ajc and iajc are basically the same except that iajc is incremental (that's the i in iajc). This means that the compiler checks time stamps and does a smarter incremental build if possible and avoids full builds (just like when using AJDT inside of eclipse). Other than this functionality, they are essentially the same. See here for more information:

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

If a project contains no aspects, using the ajc compiler is optional. These projects can be on the inpath of a project that contains aspects. To compile that contain code-style aspects, then you need to use ajc.

Annotation style aspects are a little different. If you are using annotation style for LTW only, then you can use javac to compile them as long as the correct aop.xml is created weaver is available at runtime.

However, annotation style with CTW weaving does require ajc.

In your particular case above, you can compile TestProject using javac as long as it is on the inpath of your aspect project. This would mean that the class files of your TestProject would be re-written and combined with the class files from your aspect project.

Or, if you are using LTW, then you don't need to add your TestProject to any inpath and you can use javac. But, you must set up your application for LTW at runtime.


EDIT

To answer your comment below:

Yes. You can compile your aspects project first using ajc or the iajc task. Then, you can compile your second, pure java project also by using the iajc task and additionally by putting the results of your first project on the aspect path. You cannot use javac for this at all.

The ant build.xml snippet will look something like this:

<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>

See here for more details on iajc:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文