Ich bin ein wenig verwirrt, wie der AspectJ-Compiler, ajc
funktioniert. Meines Erachtens wird ajc verwendet, um Aspekte in den kompilierten Bytecode einzubinden, dh in die .class-Datei.
Wenn ich mir jedoch das Maven-Plugin für AspectJ anschaue (aspectj-maven-plugin
), es stellt sich heraus, dass es in der ausgeführt wird generate-sources
Phase des Maven, vor dem Javac-Compiler. Das würde bedeuten, dass der Compiler dem Aspektweben nachläuft. Dies ist sinnvoll, da Sie ITDs einbinden, Klassenmitglieder ändern usw. können, über die der Java-Compiler Bescheid wissen müsste, um abhängige Klassen zu kompilieren.
Also, wenn das der Fall ist, und ajc
läuft vor javac, das nehme ich an ajc
muss zuerst den gesamten Java-Code in Byte-Code kompilieren, um in irgendeiner Hinsicht weben zu können.
Die Frage ist also, ob ajc
Warum muss Javac überhaupt ausgeführt werden, wenn der gesamte Java-Code in Byte-Code kompiliert wird? Warum ist nicht "t ajc
der einzige compiler der benötigt wird? Ist es nicht so, dass beide Programme nur doppelt ausgeführt werden? javac
behandeln die Klassen, die ajc
hat schon kompiliert? Ignoriert es sie einfach, da es keine Änderung in der Quelldatei gibt, seit die .class-Datei generiert wurde?
Antworten:
1 für die Antwort № 1ajc kann alle Klassen kompilieren, es basiert auf dem Eclipse Java Compiler. Ajc ist der einzige Compiler, der zum Generieren von Klassen erforderlich ist.
Was doppelte Anstrengungen angeht, wird Javac die meistenÜberschreiben Sie wahrscheinlich keine .class-Dateien mit einem neueren Zeitstempel als die Java-Quelldatei. Sie können sich auch Builds vorstellen, bei denen einige der Quellen mit ajc kompiliert werden, andere mit javac.
Was Maven Scheduling angeht, weiß ich nicht.
1 für die Antwort № 2
Aspectj benötigt keinen Java-Code, um Java-Code zu kompilieren. Einige frühere Versionen von AspectJ hatten diese Anforderung. Soweit ich weiß, kann Javac immer noch als Ajc-Back-End verwendet werden, indem das Flag -usejavac verwendet wird. Sie können ajc auch im Präprozessor-Modus ausführen, um Java-Quelldateien (.java) zu generieren, die mit Javac oder einem anderen Java-Compiler kompiliert werden sollen.
Die Antwort ist also, dass Javac überhaupt nicht ausgeführt wird und es keine doppelten Anstrengungen gibt.
0 für die Antwort № 3
Ich frage mich, ob die Phase für den Aspectj MavenDas Plugin, das Sie beobachten, ist ein Überbleibsel aus alten Zeiten, als AspectJ ein Quelltransformator war. Dies war vor AspectJ 1.2. Damals produzierte es Quellen, die dann einen Compiler (Javac) durchlaufen mussten. Nun ist das nicht mehr der Fall, ajc
kann alles vom Quellcode bis zum Code kompilieren. Oder manchmal wird es nach Javac verwendet, um Dinge zu weben. Wenn Sie beispielsweise Aspekte des Annotations-Stils verwenden, können Sie den Code mit javac kompilieren, und dann werden die Aspekte durch eine Binärwebung dieser Klassendateien mit ajc in die anderen Klassen gewebt.