【问题标题】:Confused how ajc works with javac对 ajc 如何与 javac 一起工作感到困惑
【发布时间】:2014-02-14 12:23:38
【问题描述】:

我有点困惑 AspectJ 编译器 ajc 的工作原理。据我了解,在谈论 CTW 时,ajc 用于将方面编织到已编译的字节码中 - 即:.class 文件。

但是,当我查看 AspectJ (aspectj-maven-plugin) 的 maven-plugin 时,发现它是在 javac 编译器之前的 maven 的 generate-sources 阶段运行的。这意味着编译器在方面编织之后运行。这是有道理的,因为您可以编织 ITD、修改类成员等,Java 编译器需要了解这些信息才能编译任何依赖类。

所以如果是这样的话,并且ajc在javac之前运行,我假设ajc必须首先将所有java代码编译成字节码才能在任何方面进行编织。

所以问题是,如果ajc 已经完成了将所有java 代码编译成字节码的努力,那么为什么javac 还需要运行呢?为什么ajc 不是唯一需要的编译器?两者都运行不只是重复努力吗?另外,javac 如何处理ajc 已经编译好的类?它是否只是忽略它们,因为自生成 .class 文件以来源文件没有任何变化?

【问题讨论】:

    标签: java aop aspectj javac compile-time-weaving


    【解决方案1】:

    我想知道您观察到的 aspectj maven 插件的阶段是否是 AspectJ 是源转换器的旧时代遗留下来的。这是在 AspectJ 1.2 之前。当时它产生的源代码必须经过编译器(javac)。现在情况不再如此,ajc 可以编译从源代码到代码的所有内容。或者有时在 javac 之后使用它来编织东西。例如,如果使用注释样式方面,您可以使用 javac 编译代码,然后使用 ajc 将这些类文件的二进制编织将这些方面编织到其他类中。

    【讨论】:

      【解决方案2】:

      Aspectj 不需要 javac 来编译 java 代码。一些以前的 AspectJ 版本有这个要求。据我所知,javac 仍然可以通过使用 -usejavac 标志用作 ajc 后端。您还可以在预处理器模式下运行 ajc 以生成要使用 javac 或其他 java 编译器编译的 Java 源 (.java) 文件。

      所以答案是 javac 根本没有运行,也没有重复的工作。

      【讨论】:

        【解决方案3】:

        ajc 可以编译所有的类,它建立在eclipse java 编译器之上。 ajc 是生成类所需的唯一编译器。

        就重复工作而言,javac 很可能不会覆盖时间戳比源 java 文件更新的 .class 文件。你也可以想象一些源代码是用ajc编译的,有些是用javac编译的。

        就 maven 调度而言,我不知道。

        【讨论】:

        • 但问题仍然存在 - 在标准构建中,如果 ajc 已经在编译所有类,为什么还要调用 javac 编译器?
        • 我不使用 maven,在我的标准构建中我不这样做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 2020-04-11
        • 2015-01-13
        • 2023-04-08
        • 2012-11-25
        • 2011-10-13
        • 2015-11-12
        相关资源
        最近更新 更多