Maven: проект compile aspectj, содержащий исходный код Java 1.6 - PullRequest
20 голосов
/ 10 апреля 2010

Основной вопрос

То, что я хочу сделать, довольно легко. Или так вы думаете. Тем не менее, ничего не работает должным образом.

Требования: Используя maven, скомпилируйте проект Java 1.6 с помощью компилятора AspectJ.

Примечание: Наш код не может быть скомпилирован с Javac. То есть он не будет компилироваться, если аспекты не вплетены (потому что у нас есть аспекты, которые смягчают исключения). <ч /> Обновление 21.02.2011: Для этого есть два одинаково жизнеспособных решения (в обоих случаях используется aspectj-maven-plugin совместно с maven-compiler-plugin ):

  1. Добавить <failOnError>false</failOnError> плагину компилятора (спасибо Паскаль Thivent )
  2. Добавить <phase>process-sources</phase> в плагин компилятора aspectj (спасибо Эндрю Свон )

Более подробная информация об этих решениях находится в разделе ответов. Я считаю, что решение № 2 - лучший подход.

<ч />




Смежные вопросы

Вопросы (на основании неудачных попыток ниже):

  1. Как заставить maven запускать aspectj: compile напрямую, без запуска compile: compile?
  2. Как игнорировать сбой компиляции: компиляция?
  3. Как указать пользовательский 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 зависит от этих целей). Более того, для его выполнения потребуется, чтобы мы указали все цели, которые нам нужны (например, нам нужны распределенные ресурсы и тесты, которые нужно запустить, а ресурсы развернуты и т. Д.)

Ответы [ 4 ]

16 голосов
/ 18 февраля 2011

Версия 1.3 плагина AspectJ намеренно изменила фазу по умолчанию для своей цели компиляции с "process-sources" на "compile"Чтобы восстановить предыдущее поведение запуска ajc перед javac, вам просто нужно добавить тег «phase» к соответствующему тегу «execute», например:

<execution>
    <phase>process-sources</phase> <!-- or any phase before compile -->
    <goals>
        <goal>compile</goal>
        <goal>test-compile</goal>
    </goals>
</execution>
4 голосов
/ 29 июня 2010

Как насчет того, чтобы сказать maven-compiler-plugin пропустить все * .java файлы и позволить aspectj-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>
2 голосов
/ 10 апреля 2010

Я использовал эту конфигурацию в проекте для компиляции 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>

Ref: aspectj-maven-plugin

1 голос
/ 10 апреля 2010

Как указать пользовательский compilerId, который указывает на ваш собственный ajc-компилятор (то есть make compile: compile использует компилятор aspectj, отличный от plexus)?

Я не знаю, как указать другие compilerId, чем "официальные" . Не уверен, что это возможно.

Насколько я понимаю, http://jira.codehaus.org/browse/MCOMPILER-107 решит вашу проблему (AspectJ 1.6+ поддерживает Java 1. 6, верно?). К сожалению, он все еще открыт.

Как вы игнорируете сбой компиляции: компиляция?

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 и что вы не можете удалить привязку жизненного цикла по умолчанию . Так что, возможно, есть и другой вариант, но единственный, который я могу придумать, - это отключить все с с помощью <packaging>pom<packaging> и заново связать все цели вручную (по крайней мере, для следующих этапов: process-resources, compile, process-test-resources, test-compile, test, package). Схематично как то так:

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

Это может быть еще один уродливый обходной путь. Отказ от ответственности: не проверено, но должно работать.

...