Основной вопрос
То, что я хочу сделать, довольно легко. Или так вы думаете. Тем не менее, ничего не работает должным образом.
Требования:
Используя maven, скомпилируйте проект Java 1.6 с помощью компилятора AspectJ.
Примечание:
Наш код не может быть скомпилирован с Javac. То есть он не будет компилироваться, если аспекты не вплетены (потому что у нас есть аспекты, которые смягчают исключения).
<ч />
Обновление 21.02.2011:
Для этого есть два одинаково жизнеспособных решения (в обоих случаях используется aspectj-maven-plugin совместно с maven-compiler-plugin ):
- Добавить
<failOnError>false</failOnError>
плагину компилятора (спасибо
Паскаль Thivent )
- Добавить
<phase>process-sources</phase>
в плагин компилятора aspectj
(спасибо Эндрю Свон )
Более подробная информация об этих решениях находится в разделе ответов. Я считаю, что решение № 2 - лучший подход.
<ч />
Смежные вопросы
Вопросы (на основании неудачных попыток ниже):
- Как заставить maven запускать aspectj: compile напрямую, без запуска compile: compile?
- Как игнорировать сбой компиляции: компиляция?
- Как указать пользовательский compilerId, который указывает на ваш собственный ajc-компилятор (то есть make compile: compile использует компилятор aspectj, отличный от plexus)? *
Спасибо за любые предложения. Вот те вещи, которые я пробовал, которые привели к моей проблеме / вопросам:
Попытка 1 (ошибка):
Укажите aspectJ в качестве компилятора для подключаемого модуля maven-compiler:
<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
Независимо от того, какую версию компилятора plexus я использую (1.8, 1.6, 1.3 и т. Д.), Это не работает. Я на самом деле прочитал исходный код и обнаружил, что этот компилятор не любит исходный код выше Java 1.5.
Попытка 2 (ошибка):
Используйте аспектJ-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<br/>
mvn clean compile
потому что он пытается выполнить compile: compile перед запуском aspectj: compile. Как отмечалось выше, наш код не компилируется с javac - аспекты обязательны. Поэтому mvn нужно вообще пропустить цель compile: compile и запустить только aspectj: compile.
Попытка 3 (работает, но неприемлемо):
Используйте ту же конфигурацию выше, но вместо этого запустите:
mvn clean aspectj:compile
Это работает, поскольку оно успешно собирается, но недопустимо в том смысле, что мы должны иметь возможность запускать цель компиляции и цель тест-компиляции напрямую (автоматическая сборка m2eclipse зависит от этих целей). Более того, для его выполнения потребуется, чтобы мы указали все цели, которые нам нужны (например, нам нужны распределенные ресурсы и тесты, которые нужно запустить, а ресурсы развернуты и т. Д.)