Знаток: скомпилируйте aspectj проект, содержащий источник Java 1.6

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

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

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

Примечание: Наш код не может скомпилировать с javac. Таким образом, это приводит компиляцию к сбою, если аспекты не ткут в (потому что у нас есть аспекты, которые смягчают исключения).


Обновление 21.02.2011: существует два одинаково эффективных решения этого (оба случая используют aspectj-maven-plugin в conjuction с плагином компилятора знатока):

  1. Добавить <failOnError>false</failOnError> к плагину компилятора (благодарит Pascal Thivent),
  2. Добавить <phase>process-sources</phase> к aspectj плагину компилятора (благодарит Andrew Swan),

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







Связанные вопросы

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

  1. Как Вы заставляете знатока выполнять aspectj:compile цель непосредственно, никогда не работая compile:compile?
  2. Как Вы игнорируете отказ compile:compile?
  3. Как Вы указываете пользовательский compilerId, который указывает на Ваш собственный ajc компилятор (который является, заставляют compile:compile использовать aspectj компилятор кроме сплетения одно)? *
Спасибо за любого и все предложения. Это вещи, которые я попробовал, которые привели к моей проблеме/вопросам:


Попытка 1 (сбой): Укажите aspectJ как компилятор для плагина компилятора знатока:
<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 автосборка зависит от тех целей). Кроме того, выполняя его этот путь потребовал бы, чтобы мы обстоятельно объяснили каждую цель, которую мы хотим по пути (например, нам нужны распределенные ресурсы и тесты, которые будут выполнены и тестовые развернутые ресурсы, и т.д.),

20
задан naXa 10 August 2017 в 11:16
поделиться

3 ответа

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

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

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

1
ответ дан 30 November 2019 в 01:02
поделиться

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

2
ответ дан 30 November 2019 в 01:02
поделиться

Как насчет того, чтобы указать 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>
4
ответ дан 30 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: