Плетение Maven + AspectJ для Java8

Я не могу пакет mvn с приведенным ниже минимальным образцом. Eclipse (Mars.2 Release 4.5.2) компилируется и плетется без проблем.

Что мне нужно сделать, чтобы заставить его работать?

Выход:

[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ test ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 2 source files to ...\workspace\test\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] .../workspace/test/src/main/java/test/Foo.java:[6,21] cannot find symbol
  symbol: method doSomethingInjected()

Пример класса:

package test;

public class Foo {
    public void bar() {
        this.doSomethingInjected();
    }
}

Пример интерфейса:

package test;

public interface Injectable { }

аспект:

package test;

public aspect Injection {

    declare parents : test..* implements Injectable;

    public void Injectable.doSomethingInjected() {
        System.out.println("done");
    }
}

pom.xml (соответствующие части согласно документу по использованию плагина aspectj-maven-plugin)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.9</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.9</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

person hansi    schedule 14.01.2017    source источник


Ответы (1)


Попробуйте это, это заставляет ваш проект компилироваться и работать чисто (я проверял):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>de.scrum-master.stackoverflow</groupId>
  <artifactId>aspectj-introduce-method</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.source-target.version>1.8</java.source-target.version>
    <aspectj.version>1.8.10</aspectj.version>
  </properties>

  <build>

    <plugins>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
          <source>${java.source-target.version}</source>
          <target>${java.source-target.version}</target>
          <!-- IMPORTANT -->
          <useIncrementalCompilation>false</useIncrementalCompilation>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.9</version>
        <configuration>
          <!--<showWeaveInfo>true</showWeaveInfo>-->
          <source>${java.source-target.version}</source>
          <target>${java.source-target.version}</target>
          <Xlint>ignore</Xlint>
          <complianceLevel>${java.source-target.version}</complianceLevel>
          <encoding>${project.build.sourceEncoding}</encoding>
          <!--<verbose>true</verbose>-->
          <!--<warn>constructorName,packageDefaultMethod,deprecation,maskedCatchBlocks,unusedLocals,unusedArguments,unusedImport</warn>-->
        </configuration>
        <executions>
          <execution>
            <!-- IMPORTANT -->
            <phase>process-sources</phase>
            <goals>
              <goal>compile</goal>
              <goal>test-compile</goal>
            </goals>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>${aspectj.version}</version>
          </dependency>
        </dependencies>
      </plugin>

    </plugins>

  </build>

  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>${aspectj.version}</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>

</project>
person kriegaex    schedule 14.01.2017
comment
Два вопроса: как мне настроить его в maven, если мои аспекты находятся в тестовой банке? Во-вторых, почему именно две строки отмечены знаком ‹!-- Важно --› ? Я не смог найти никакого объяснения, почему именно они необходимы. - person Mark Boon; 15.03.2017
comment
Вопрос № 2: Это были заметки для меня, потому что для использования инкрементной компиляции вы должны установить для нее значение false, см. этот заявка на ошибку для компилятора Maven. Установка фазы для обработки источников для AspectJ Maven помогает избежать определенных проблем, если другой код скомпилирован с помощью компилятора Maven. Этап по умолчанию — компиляция, но в большинстве случаев лучше использовать исходники процессов (ранее). Я не хочу вдаваться в подробности здесь, в комментарии. - person kriegaex; 15.03.2017
comment
Вопрос № 1: вы должны добавить test-jar в качестве тестовой зависимости для модуля, в котором вы хотите его использовать, а затем обратиться к нему из раздела aspectLibraries AspectJ Maven. Возможно, вы затем определили бы две отдельные конфигурации/выполнения плагина для compile и test-compile, чтобы избежать попадания ваших тестовых аспектов в производство. Но я не уверен, что это нужно, я не пробовал. Интересный вопрос однако. Если у вас есть дополнительные вопросы, я предлагаю открыть совершенно новый вопрос, чтобы мы могли разобраться с ним отдельно. - person kriegaex; 15.03.2017
comment
Вот мой полный помпон - person Mark Boon; 15.03.2017