6

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

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

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

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

4

3 回答 3

3

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

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

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

于 2014-01-23T19:10:02.057 回答
1

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

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

于 2014-05-22T06:26:01.953 回答
0

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

于 2014-05-22T18:23:39.313 回答