/ / Confuse comment jc fonctionne avec javac - java, aop, aspectj, javac, compile-time-weaving

Confondu comment ajc fonctionne avec javac - java, aop, aspectj, javac, compile-time-weaving

Je suis un peu confus comment le compilateur AspectJ, ajc travaux. D'après ce que je comprends de CTW, ajc est utilisé pour incorporer des aspects dans le code octet compilé, c'est-à-dire: le fichier .class.

Cependant, quand je regarde le maven-plugin pour AspectJ (aspectj-maven-plugin), il s’avère qu’il est exécuté dans le generate-sources phase de maven, avant le compilateur javac. Ce qui impliquerait que le compilateur s'exécute après le tissage d'aspect. Cela a du sens, car vous pouvez tisser dans les ITD, modifier les membres de la classe, etc., ce que le compilateur Java devrait connaître pour pouvoir compiler les classes dépendantes.

Donc, si tel est le cas, et ajc fonctionne avant javac, je présume que ajc Il faut d’abord compiler tout le code Java en code octet pour pouvoir tisser tous les aspects.

Donc la question est, si ajc passe déjà par les efforts de compilation de tout le code java en code octet. Pourquoi javac doit-il même être exécuté? Pourquoi n'est-ce pas? ajc le seul compilateur requis? Est-ce que les deux ne font pas que dupliquer les efforts? De plus, comment javac gérer les classes qui ajc a déjà compilé? Est-ce qu'il les ignore simplement puisqu'il n'y a pas de changement dans le fichier source depuis la génération du fichier .class?

Réponses:

1 pour la réponse № 1

ajc peut compiler toutes les classes, il est construit sur le compilateur java eclipse. ajc est le seul compilateur requis pour générer des classes.

autant que des efforts en double, javac sera le plusprobablement pas écraser les fichiers .class qui ont un horodatage plus récent que le fichier java source. Vous pouvez aussi imaginer des versions où certaines des sources sont compilées avec ajc et d’autres avec javac.

en ce qui concerne la planification maven, je ne sais pas.


1 pour la réponse № 2

Aspectj n'a pas besoin de javac pour compiler le code java. Certaines versions précédentes d'AspectJ avaient cette exigence. Autant que je sache, javac peut toujours être utilisé comme back-end ajc en utilisant le drapeau -usejavac. Vous pouvez également exécuter ajc en mode préprocesseur pour générer des fichiers source Java (.java) à compiler à l'aide de javac ou d'un autre compilateur java.

La réponse est donc que javac ne fonctionne pas du tout et qu'il n'y a pas d'effort en double.


0 pour la réponse № 3

Je me demande si la phase pour l'aspectj mavenplugin que vous observez est un vestige de l’époque où AspectJ était un transformateur de source. C'était avant AspectJ 1.2. A cette époque, il produisait des sources qui devaient ensuite passer par un compilateur (javac). Maintenant ce n'est plus le cas, ajc peut tout compiler de la source au code. Ou parfois, il est utilisé après javac pour tisser des choses. Par exemple, si vous utilisez des aspects de style d'annotation, vous pouvez compiler le code avec javac, puis un tissage binaire de ces fichiers de classe avec ajc tissera les aspects dans les autres classes.