/ / Verwirrt, wie Ajc mit Javac arbeitet - Java, AOP, Aspectj, Javac, Compile-Time-Weaving

Verwirrt, wie ajc mit javac arbeitet - java, aop, aspectj, javac, kompilieren-zeit-weben

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 № 1

ajc 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.