У меня было немного времени и я воссоздал ваш проект Maven на моей машине.То, что я сказал в своем комментарии, на самом деле верно, поэтому я цитирую себя здесь, чтобы превратить его в ответ:
На первый взгляд две вещи кажутся мне странными:
- Вы применяете ткачество во время компиляции, но также предоставляете aop.xml , который необходим только для ткачества во время загрузки.Так в какую сторону ты хочешь пойти?Для CTW вы можете просто удалить его.
- Во-вторых, pointcut
execution(org.kayd.Client.data())
должен привести к ошибке компиляции, поскольку синтаксис недопустим (для сигнатуры метода не указан тип возврата).Вам лучше использовать что-то вроде execution(* org.kayd.Client.data())
или execution(void org.kayd.Client.data())
.
Я хочу добавить, что использование after
в качестве имени метода не рекомендуется, поскольку в собственном синтаксисе AspectJ этозарезервированное ключевое словоКомпилятор не жалуется, но все же вы должны быть здесь осторожны.
Я изменил ваш аспект следующим образом, чтобы избежать ошибки компиляции Maven, а также чтобы увидеть больше на консоли:
package org.kayd;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectTest {
@Pointcut("execution(* *(..))")
public void defineEntryPoint() {}
@Before("defineEntryPoint()")
public void log(JoinPoint joinPoint) {
System.out.println("Before advice on " + joinPoint);
}
@After("execution(org.kayd.Client.data())")
public void afterAdvice(JoinPoint joinPoint) {
System.out.println("After advice on " + joinPoint);
}
}
Я также немного увеличил POM, потому что вы используете последнюю версию AspectJ с одной стороны, но старую версию плагина AspectJ Maven в зависимости от более старой версии, что приводит к странному выводу журнала на консоль Maven.Кроме того, я добавил упаковщик One-JAR и плагин Maven Exec, так что у вас есть все приложение в одном Uber-JAR и вы можете просто запустить его без чего-либо еще в пути к классам.
<?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>org.kayd</groupId>
<artifactId>AOP</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.9.2</aspectj.version>
<main-class>org.kayd.Client</main-class>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</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.11</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>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<mainClass>${main-class}</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
<configuration>
<onejarVersion>0.96</onejarVersion>
<mainClass>de.scrum_master.app.FooBar</mainClass>
<attachToBuild>true</attachToBuild>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<configuration>
<mainClass>${main-class}</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</project>
Затем выполните что-то вродеmvn clean verify
, а затем любой из этих двух:
mvn exec:java
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------< org.kayd:AOP >----------------------------
[INFO] Building AOP 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ AOP ---
Before advice on execution(void org.kayd.Client.main(String[]))
Before advice on execution(void org.kayd.Client.data())
kayd
After advice on execution(void org.kayd.Client.data())
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.043 s
[INFO] Finished at: 2018-12-12T12:07:59+07:00
[INFO] ------------------------------------------------------------------------
Или, если вы хотите запустить Über-JAR:
java -jar target\AOP-1.0-SNAPSHOT.one-jar.jar
Before advice on execution(void org.kayd.Client.main(String[]))
Before advice on execution(void org.kayd.Client.data())
kayd
After advice on execution(void org.kayd.Client.data())