Запутался, как ajc работает с javac

Я немного запутался, как работает компилятор AspectJ, ajc. Насколько я понимаю, когда мы говорим о CTW, ajc используется для вплетения аспектов в скомпилированный байт-код, то есть в файл .class.

Однако, когда я смотрю на maven-plugin для AspectJ (aspectj-maven-plugin), оказывается, что он запускается на generate-sources фазе maven перед компилятором javac. Это означало бы, что компилятор запускается после переплетения аспектов. В этом есть смысл, поскольку вы можете вплетать ITD, изменять члены классов и т. Д., О чем компилятору java необходимо знать, чтобы скомпилировать любые зависимые классы.

Так что, если это так, и ajc запускается до javac, я предполагаю, что ajc должен сначала скомпилировать весь java-код в байтовый код, чтобы иметь возможность переплетать любые аспекты.

Итак, вопрос в том, что если ajc уже предпринимает усилия по компиляции всего java-кода в байт-код, почему javac вообще нужно запускать? Почему ajc не единственный компилятор, который требуется? Разве оба запуска не дублируют усилия? Кроме того, как javac обрабатывает классы, которые ajc уже скомпилированы? Он просто игнорирует их, поскольку в исходном файле нет изменений с момента создания файла .class?


person Eric B.    schedule 23.01.2014    source источник


Ответы (3)


ajc может компилировать все классы, он построен на java-компиляторе eclipse. ajc - единственный компилятор, который требуется для генерации классов.

Что касается дублирования усилий, javac, скорее всего, не перезапишет файлы .class с более новой меткой времени, чем исходный файл java. также вы можете представить сборки, в которых некоторые исходные коды скомпилированы с использованием ajc, а некоторые - с помощью javac.

Что касается планирования maven, я не знаю.

person aepurniet    schedule 23.01.2014
comment
Но остается вопрос - в стандартной сборке зачем вообще вызывать компилятор javac, если ajc уже изначально компилирует все классы? - person Eric B.; 23.01.2014
comment
Я не использую maven, в моей стандартной сборке я этого не делаю. - person aepurniet; 24.01.2014

Aspectj не требует javac для компиляции кода Java. Некоторые предыдущие версии AspectJ имели это требование. Насколько я знаю, javac все еще можно использовать как серверную часть ajc, используя флаг -usejavac. Вы также можете запустить ajc в режиме препроцессора для создания файлов исходного кода Java (.java), которые будут скомпилированы с помощью javac или другого компилятора java.

Итак, ответ - javac вообще не работает и дублирования усилий нет.

person vach    schedule 22.05.2014

Интересно, является ли фаза для плагина Aspectj maven, которую вы наблюдаете, пережитком очень старых времен, когда AspectJ был преобразователем исходного кода. Это было до AspectJ 1.2. В то время он производил исходники, которые затем должны были пройти через компилятор (javac). Теперь этого больше нет, ajc может компилировать все, от исходного кода до кода. Или иногда его используют после javac для плетения вещей. Например, при использовании аспектов стиля аннотации вы можете скомпилировать код с помощью javac, а затем двоичное переплетение этих файлов классов с помощью ajc будет вплетать аспекты в другие классы.

person Andy Clement    schedule 22.05.2014