我在将包含一些自定义方面的实用程序jar文件导入另一个项目时遇到了一些困难。应该注意的是,我在这个项目中使用Spring
我创建了一个概念证明(下面的完整代码示例)。当我在实用程序jar中运行一个测试运行器时,任何使用我的AspectJ注释注释的方法都可以很好地执行它们的方面。当我在另一个项目中使用自相同的jar时,方面被忽略。
当我在实用程序中运行主类时,我得到:
$> java -cp aspectjrt-1.8.2.jar;aop-util-1.0-SNAPSHOT.jar TestOne
AspectOne's aroundAdvice's body is now executed Before aspectTestMethod is called.
Executing TestOne.aspectTestMethod()
AspectOne's aroundAdvice's body is now executed After aspectTestMethod is called.
如果我运行消费者类的主类,我得到:
$>java -cp aspectjrt-1.8.2.jar;aop-util-1.0-SNAPSHOT.jar;aop-consumer-1.0-SNAPSHOT.jar Test
Test.testAspectOne
AspectTwo's aroundAdvice's body is now executed Before aspectTestMethod is called.
Test.testAspectTwo
AspectTwo's aroundAdvice's body is now executed After aspectTestMethod is called.
由于我对面向方面编程相当新,我真的很感激指出我缺少的东西:)
<?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>sandbox.aop</groupId>
<artifactId>aop-util</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationOne { }
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.JoinPoint;
@Aspect
public class AspectOne {
@Pointcut("@annotation(AnnotationOne)")
public void annotationPointCutDefinition(){
}
@Pointcut("execution(* *(..))")
public void atExecution(){}
@Around("@annotation(AnnotationOne) && execution(* *(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
Object returnObject = null;
try {
System.out.println("AspectOne's aroundAdvice's body is now executed Before aspectTestMethod is called.");
returnObject = joinPoint.proceed();
} catch (Throwable throwable) {
throw throwable;
}
finally {
System.out.println("AspectOne's aroundAdvice's body is now executed After aspectTestMethod is called.");
}
return returnObject;
}
@After("annotationPointCutDefinition() && atExecution()")
public void printNewLine(JoinPoint pointcut){
System.out.print("\n\r");
}
}
public class TestOne {
public static void main(String[] args) {
TestOne testOne = new TestOne();
testOne.aspectTestMethod();
}
@AnnotationOne
public void aspectTestMethod(){
System.out.println("Executing TestOne.aspectTestMethod()");
}
}
<?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>sandbox.aop</groupId>
<artifactId>aop-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>sandbox.aop</groupId>
<artifactId>aop-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationTwo {}
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectTwo {
@Pointcut("@annotation(AnnotationTwo)")
public void annotationPointCutDefinition(){
}
@Pointcut("execution(* *(..))")
public void atExecution(){}
@Around("@annotation(AnnotationTwo) && execution(* *(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
Object returnObject = null;
try {
System.out.println("AspectTwo's aroundAdvice's body is now executed Before aspectTestMethod is called.");
returnObject = joinPoint.proceed();
} catch (Throwable throwable) {
throw throwable;
}
finally {
System.out.println("AspectTwo's aroundAdvice's body is now executed After aspectTestMethod is called.");
}
return returnObject;
}
@After("annotationPointCutDefinition() && atExecution()")
public void printNewLine(JoinPoint pointcut){
System.out.print("\n\r");
}
}
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.testAspectOne();
test.testAspectTwo();
}
@AnnotationOne
public void testAspectOne() {
System.out.println(Test.class.getName() + ".testAspectOne");
}
@AnnotationTwo
public void testAspectTwo() {
System.out.println(Test.class.getName() + ".testAspectTwo");
}
}
答案 0 :(得分:2)
您需要告诉aspectj weaver使用aspectLibraries编织库中定义的方面:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>sandbox.aop</groupId>
<artifactId>aop-util</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>