我有点搞不懂AspectJ编译器ajc是如何工作的。据我所知,当谈到CTW时,ajc被用来将方面编织到编译后的字节代码中-即:.class文件。
但是,当我查看用于AspectJ的maven-plugin (aspectj-maven-plugin)时,发现它是在maven的generate-sources阶段运行的,而不是在javac编译器之前。这意味着编译器在方面编织之后运行。这是有意义的,因为您可以编织ITD,修改类成员等,java编译器需要知道这些才能编译任何依赖类。
因此,如果是这种情况,并且ajc在javac之前运行,我认为ajc必须首先将所有java代码编译成字节码,才能在任何方面进行编织。
所以问题是,如果ajc已经完成了将所有java代码编译成字节码的工作,那么为什么还要运行它呢?为什么ajc不是唯一需要的编译器?让两者都运行不就是重复工作吗?此外,javac如何处理ajc已经编译的类?它会忽略它们吗?因为自生成.class文件以来,源文件中没有任何更改。
发布于 2014-01-24 03:10:02
ajc可以编译所有的类,它建立在eclipse java编译器之上。ajc是生成类所需的唯一编译器。
就重复工作而言,javac很可能不会覆盖时间戳比源java文件更新的.class文件。你也可以想象一些源代码是用ajc编译的,还有一些是用javac编译的。
至于maven调度,我不知道。
发布于 2014-05-22 14:26:02
Aspectj不需要javac来编译java代码。某些以前版本的AspectJ有此要求。据我所知,通过使用-usejavac标志,javac仍然可以用作ajc后端。您还可以在预处理器模式下运行ajc,以生成要使用javac或其他Java编译器编译的java source (.java)文件。
所以答案是javac根本没有运行,没有重复的工作。
发布于 2014-05-23 02:23:39
我想知道你所观察到的aspectj maven插件的阶段是否是AspectJ还是一个源代码转换器时遗留下来的。这是在AspectJ 1.2之前。当时,它生成的源代码必须经过编译器(javac)。现在情况不再是这样了,ajc可以编译从源代码到代码的所有内容。或者有时在javac之后使用它来编织东西。例如,如果使用注解风格的方面,您可以使用javac编译代码,然后使用ajc对这些类文件进行二进制编织,将方面编织到其他类中。
https://stackoverflow.com/questions/21316904
复制相似问题