我对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调度而言,我不知道。