困惑ajc如何使用javac

时间:2014-01-23 18:51:59

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

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

但是,当我查看AspectJ的maven-plugin(aspectj-maven-plugin)时,事实证明它在javac编译器之前在maven的generate-sources阶段运行。这意味着编译器在编织方面之后运行。这是有道理的,因为你可以编织ITD,修改类成员等,java编译器需要知道这些,以便编译任何依赖类。

因此,如果是这种情况,并且ajc在javac之前运行,我认为ajc必须首先将所有java代码编译成字节代码,以便能够在任何方面编织。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

相关问题