То, что я хочу сделать, довольно легко. Или таким образом, Вы думали бы. Однако ничто не работает правильно.
Требование: Используя знатока, скомпилируйте проект Java 1.6 использование компилятора AspectJ.
Примечание: Наш код не может скомпилировать с javac. Таким образом, это приводит компиляцию к сбою, если аспекты не ткут в (потому что у нас есть аспекты, которые смягчают исключения).
<failOnError>false</failOnError>
к плагину компилятора (благодарит Pascal Thivent),<phase>process-sources</phase>
к aspectj плагину компилятора (благодарит Andrew Swan),Больше информации об этих решениях находится в разделе ответа. Я полагаю, что решением № 2 является лучший подход.
Вопросы (на основе неудачных попыток ниже):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerId>aspectj</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-aspectj</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</plugin>
Это перестало работать с ошибкой:
org.codehaus.plexus.compiler.CompilerException: The source version was not recognized: 1.6
Какую версию компилятора сплетения я использую (1.8, 1.6, 1.3, и т.д.), это не работает. Я на самом деле прочитал исходный код и нашел, что этому компилятору не нравится исходный код выше Java 1.5.
Попытка 2 (сбой): Используйте aspectJ-maven-plugin, присоединенного к целям тестовой компиляции и компиляции:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
Это перестало работать при выполнении также:
mvn clean test-compile
mvn clean compile
потому что это пытается выполнить compile:compile прежде, чем выполнить aspectj:compile. Как отмечено выше, наш код не компилирует с javac - аспекты требуются. Таким образом, mvn должен был бы пропустить compile:compile цель в целом и работать только aspectj:compile.
Попытайтесь 3 (работы, но недопустимый):
Используйте ту же конфигурацию выше, но вместо этого работайте:
mvn clean aspectj:compile
Это работает, в котором это создает успешно, но это недопустимо в этом, мы должны смочь выполнить цель компиляции, и цель тестовой компиляции непосредственно (m2eclipse автосборка зависит от тех целей). Кроме того, выполняя его этот путь потребовал бы, чтобы мы обстоятельно объяснили каждую цель, которую мы хотим по пути (например, нам нужны распределенные ресурсы и тесты, которые будут выполнены и тестовые развернутые ресурсы, и т.д.),
Как указать собственный compilerId, указывающий на ваш собственный компилятор ajc (то есть make compile: compile использовать компилятор aspectj, отличный от plexus)?
Я не знаю, как указать другой compilerId
, кроме "официальных" . Не уверен, что это возможно.
Насколько я понимаю, http://jira.codehaus.org/browse/MCOMPILER-107 решит вашу проблему (AspectJ 1.6+ действительно поддерживает Java 1.6, верно?). К сожалению, он все еще открыт.
Как игнорировать ошибку compile: compile?
Цель compiler: compile
плагина Maven Compiler имеет необязательный параметр failOnError
позволяя до Укажите, будет ли сборка продолжена даже при наличии ошибок компиляции .
<project>
...
<build>
...
<plugins>
...
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnError>false</failOnError>
...
</configuration>
</plugin>
</plugins>
</build>
</project>
Это могло быть некрасивым решением вышеупомянутой проблемы.
Как заставить maven запускать цель aspectj: compile напрямую, без запуска compile: compile?
Проблема в том, что compiler: compile
привязан к compile
] и что вы не можете удалить привязку жизненного цикла по умолчанию .Так что, возможно, есть другой вариант, но единственный, который я могу придумать, - это отключить все с помощью
и заново привязать все цели вручную ( по крайней мере, для этих фаз: ресурсы процесса
, компиляция
, ресурсы тестирования процесса
, тестовая компиляция
, тест
, пакет
). Схематично это примерно так:
process-resources resources:resources compile aspectj:compile process-test-resources resources:testResources test-compile compiler:testCompile test surefire:test package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war install install:install deploy deploy:deploy
Это может быть еще один уродливый обходной путь. Отказ от ответственности: не проверено, но должно работать.
Я использовал эту конфигурацию в проекте для компиляции AspectJ и Java 6 с помощью Maven:
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ссылка: аспектj-maven-plugin
Как насчет того, чтобы указать maven-compiler-plugin пропустить все файлы * .java и позволить аспекту-maven-plugin выполнять свою работу?
...
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal> <!-- weave main classes -->
<goal>test-compile</goal> <!-- weave test classes -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>