我对AspectJ编译器ajc的工作方式有些困惑。据我所知,谈论CTW时,使用了ajc将方面编织到已编译的字节码中,即:.class文件。

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

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

因此,问题是,如果ajc已经通过将所有Java代码编译为字节代码的工作,为什么Javac甚至根本不需要运行?为什么ajc不是唯一需要的编译器?难道两个人都只是在重复努力吗?另外,javac如何处理ajc已经编译的类?因为自生成.class文件以来源文件没有任何更改,它是否只是忽略它们?

最佳答案

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

就重复的工作而言,javac最有可能不会覆盖时间戳比源Java文件新的.class文件。您也可以想象构建时,其中某些源是使用ajc编译的,而某些源是使用javac编译的。

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

09-12 17:03