Компиляция с помощью maven-compiler-plugin и maven-aspectj-plugin

Когда я использую maven-apsectj-plugin и maven-compiler-plugin, compile фазы будут выполнять оба плагина compile цель. Это приводит к компиляции сначала с javac, а затем к полной перекомпиляции с ajc.

Нужна ли эта двойная компиляция? Кажется, я могу просто выключить maven-compiler-plugin и все работает нормально.

Я использую конфигурацию «по умолчанию», как указано в использовании maven-compiler-plugin:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.13</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.11</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
              <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

person Yaroslav Buhaiev    schedule 08.07.2019    source источник


Ответы (1)


Да, вы можете деактивировать подключаемый модуль компилятора Maven, поскольку компилятор AspectJ является регулярно обновляемой вилкой компилятора Eclipse Java. Таким образом, он также может компилировать ваши файлы Java.

Но если ситуация более сложная, т.е. вы используете компилятор Maven для компиляции файлов Groovy или файлов в других модулях и хотите настроить его только один раз в <pluginManagement>, возможно, его деактивация не такой уж хороший вариант. Есть способ заставить оба плагина хорошо работать вместе, смотрите другие мои ответы

В основном вы настраиваете компилятор Maven для использования <useIncrementalCompilation>false</useIncrementalCompilation> и AspectJ Maven для использования <phase>process-sources</phase>. Дополнительная информация находится в связанных ответах.

Затем вы увидите такой вывод:

[INFO] --- aspectj-maven-plugin:1.12.1:compile (default) @ openbook_cleaner ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[INFO] 
[INFO] --- aspectj-maven-plugin:1.12.1:test-compile (default) @ openbook_cleaner ---
[WARNING] No sources found skipping aspectJ compile
[INFO] 
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ openbook_cleaner ---
[INFO] Nothing to compile - all classes are up to date
person kriegaex    schedule 09.07.2019
comment
Спасибо за ответ @kriegaex. Не знаю, должен ли это быть ответ сам по себе, и я, вероятно, задам отдельный вопрос, но вы, кажется, тот человек, которого можно спросить. - person Yaroslav Buhaiev; 10.07.2019
comment
У меня есть проект, который использует скомпилированные аспекты и переплетает их во время компиляции. К сожалению, AJC не поддерживается Lombok. Поскольку этот проект не имеет каких-либо источников аспектов сам по себе, я настроил плагин AspectJ Maven для создания байт-кода после компиляции: <forceAjcCompile>true</forceAjcCompile> <sources/> <weaveDirectory>${project.build.outputDirectory}</weaveDirectory> Таким образом, сначала будет вызываться Lombok + Javac, а затем модифицироваться с аспектами. Существуют ли какие-либо ограничения/недостатки при выполнении переплетения байт-кода в классах, сгенерированных javac? - person Yaroslav Buhaiev; 10.07.2019
comment
Это определенно новый вопрос. Пожалуйста, создайте один, включающий небольшой MCVE, то есть вашу (многомодульную?) сборку Maven с ломбокским образцом класса + основной метод, аспект - что-то, что я могу скопировать (или клонировать с GitHub), полностью собрать и запустить. Тогда я, наверное, смогу тебе помочь. - person kriegaex; 10.07.2019