Использование аннотаций AspectJ в проекте Maven: ткачество не работает - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь использовать AspectJ в простом проекте без использования Spring, и хотя я видел похожие вопросы, и мой код кажется правильным, я не понимаю, почему он не работает. Я использую Eclipse Oxygen 4.7.3 (не использую инструменты AJDT), JDK 7, maven 3.5.2, и мой код выглядит следующим образом:

pom.xml

    <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>com</groupId>
  <artifactId>aspect-tutorial</artifactId>
  <version>0.0.1-SNAPSHOT</version>


<properties>
    <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.7</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.8</version>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <complianceLevel>1.7</complianceLevel>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>

        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

    </plugins>
</build>
</project>

MainApp.java

package com.pkg;

public class MainApp {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        HelloWorld a = new HelloWorld();
        a.printHello();
    }
}

HelloWorld.java

package com.pkg;

public class HelloWorld {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void printHello() {
        System.out.println("Print Hello...");
   }

}

TestAspect.java

package com.pkg;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;


@Aspect
public class TestAspect {       

    @Before("execution(* com.pkg.HelloWorld.printHello(..))")
    public void testBefore2(){
        System.out.println("Yeeha");
    }


}

Запуск mvn clean install успешен, но вывод выводит только часть «Print Hello ...». Должен ли я использовать другой подход? (Возможно, вместо этого используйте файл .aj или попробуйте изменить время загрузки). Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Проблема заключается в настройке AspectJ Maven и Maven Compiler. Мои POM для AspectJ обычно выглядят немного иначе, чем ваши (еще несколько настроек), но вот ваши с минимальными изменениями, чтобы заставить его работать:

<?xml version="1.0" encoding="UTF-8"?>
<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>com</groupId>
  <artifactId>aspect-tutorial</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.13</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.11</version>
        <configuration>
          <complianceLevel>1.7</complianceLevel>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
        <executions>
          <execution>
            <!-- IMPORTANT -->
            <phase>process-sources</phase>
            <goals>
              <goal>compile</goal>
              <goal>test-compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven.compiler.plugin.version}</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <!-- IMPORTANT -->
          <useIncrementalCompilation>false</useIncrementalCompilation>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.4.0</version>
        <configuration>
          <mainClass>com.pkg.MainApp</mainClass>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>

Посмотрите, как установить инкрементную компиляцию на false для компилятора Maven? Это происходит из-за старой ошибки (все еще не исправленной), которая фактически инвертирует переключатель, поэтому для того, чтобы инкрементная компиляция работала, вы должны «деактивировать» ее. Очень странно.

Вам также нужно определить выполнение для фазы process-sources для AspectJ Maven.

Кроме того, я обновился до AspectJ Maven 1.11 и, следовательно, до AspectJ runtime 1.8.13.

Я также добавил плагин Maven Exec, чтобы легко доказать, что он работает сейчас. Просто позвоните mvn clean compile exec:java и проверьте вывод:

(...)
[INFO] --- aspectj-maven-plugin:1.11:compile (default) @ aspect-tutorial ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[INFO] 
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ aspect-tutorial ---
[INFO] Nothing to compile - all classes are up to date
(...)
[INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ aspect-tutorial ---
Yeeha
Print Hello...
(...)

В противном случае я поддерживаю то, что сказал Нандор: убедитесь, что вы используете плагины AspectJ для Eclipse или IDEA, если вы также хотите запускать свой Java-код с расширенными аспектами из IDE.

0 голосов
/ 09 мая 2018

Как вы запускаете свое приложение? Чисто из мавена или из затмения? У вас есть Eclipse для автоматической сборки ваших проектов? Если да, вы, вероятно, не добьетесь большого успеха с ткачеством во время компиляции, потому что Eclipse перезапишет ваши классы, построенные в Maven, классами, построенными в Eclipse. Без установленной функции AJDT и правильно настроенного проекта рабочей области с характером AspectJ полученный скомпилированный код не будет «улучшен» ткачом AspectJ.

...