Aspectj没有使用eclipse Luna

Kee*_*tah 6 eclipse aspectj eclipse-plugin

我试图在eclipse 4.4.0(Luna)中使用aspectJ.Y找不到适合这个版本的eclipse的任何ajdt插件.

无论如何我认为aspectj应该工作,所以我将aspectj jar放在我的webApp的lib目录中,并创建这个Aspect类:

@Aspect
public class LoggerAspect {

    @Before("(execution(* *.*(..))")
    public void intercept(JoinPoint jp) {
        System.out.print("before");
    }

    @After("(execution(* *.*(..))")
    public void afterReturning(JoinPoint jp) {
        System.out.print("after");
    }

    @AfterThrowing(pointcut = "execution(* *.*(..))")
    public void logException(JoinPoint jp, Exception t) {
        System.out.print("throwing");
    }
}
Run Code Online (Sandbox Code Playgroud)

但没有记录任何东西.我错过了什么?

Arj*_*jan 20

如果您在pom.xml中设置了AspectJ Maven插件,那么为了在Luna中使用它,您似乎首先需要添加以下更新站点(菜单帮助,安装新软件):

http://download.eclipse.org/tools/ajdt/44/dev/update/

从该站点,安装AspectJ开发工具.

安装完成后,您还可以通过Preferences,Maven,Discovery,Open Catalog 安装Maven Integration for AJDT,然后选择AspectJ m2e Configurator.

(尝试在安装工具之前执行最后一步,将抛出一个缺失的要求:AspectJ开发工具核心2.1.3.尝试从默认的Luna更新站点安装AspectJ时会抛出相同的错误.)


kri*_*aex 4

如果您想使用 AJDT,请尝试使用 Kepler。;-)

顺便说一句,您是否使用ajc(AspectJ 编译器)编译了切面和 Java 类?或者你想用javac编译它们?在这种情况下,您需要在运行时编织方面(LTW,加载时编织),并且需要编织代理 ( -javaagent:path/to/aspectjweaver.jar) 以及aop.xml. 在您告诉我您想做什么之后,我可以用一个具体的例子来更新这个答案。


更新:好的,我测试了你的方面。它包含一些语法错误和其他问题,例如

  • 其中@Before("(execution(* *.*(..))")数字括号不匹配。相反,它应该是@Before("execution(* *.*(..))")
  • 抛出后注释错过了异常绑定。它应该是@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "t")

现在这是一个完全可测试的独立示例:

驱动程序应用:

class Application {
    public static void main(String[] args) {
        new Application().foo();
    }

    public void foo() {
        try {
            sayHello("world");
        }
        catch (Exception e) {
            System.out.println("Caught exception: " + e); 
        }
    }

    public void sayHello(String recipient) {
        System.out.println("Hello " + recipient + "!"); 
        throw new RuntimeException("Oops!");
    }
}
Run Code Online (Sandbox Code Playgroud)

方面:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LoggerAspect {
    @Before("execution(* *.*(..))")
    public void intercept(JoinPoint jp) {
        System.out.println("before " + jp);
    }

    @After("execution(* *.*(..))")
    public void afterReturning(JoinPoint jp) {
        System.out.println("after " + jp);
    }

    @AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "t")
    public void logException(JoinPoint jp, Exception t) {
        System.out.println("throwing " + jp);
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用ajc编译和运行:

假设您的源文件位于名为 的目录中src,并且您希望类文件最终位于 中bin,则编译方式如下:

ajc -sourceroots src -1.7 -d bin -cp aspectjrt.jar
Run Code Online (Sandbox Code Playgroud)

现在运行应用程序:

java -cp bin;aspectjrt.jar Application

before execution(void Application.main(String[]))
before execution(void Application.foo())
before execution(void Application.sayHello(String))
Hello world!
after execution(void Application.sayHello(String))
throwing execution(void Application.sayHello(String))
Caught exception: java.lang.RuntimeException: Oops!
after execution(void Application.foo())
after execution(void Application.main(String[]))
Run Code Online (Sandbox Code Playgroud)

如何使用 javac 编译并使用 LTW 运行:

您需要使用调试符号(-g)进行编译:

javac -g -cp aspectjrt.jar -d bin src\*.java
Run Code Online (Sandbox Code Playgroud)

在运行该程序之前,您需要在bin\META-INF\aop.xml(或aop-ajc.xml) 下进行 LTW 配置:

ajc -sourceroots src -1.7 -d bin -cp aspectjrt.jar
Run Code Online (Sandbox Code Playgroud)

现在您可以使用编织代理运行应用程序:

java -javaagent:aspectjweaver.jar -cp bin Application
Run Code Online (Sandbox Code Playgroud)

输出是相同的,但如果您想查看更多内容,可以添加其他编织器选项,例如

java -cp bin;aspectjrt.jar Application

before execution(void Application.main(String[]))
before execution(void Application.foo())
before execution(void Application.sayHello(String))
Hello world!
after execution(void Application.sayHello(String))
throwing execution(void Application.sayHello(String))
Caught exception: java.lang.RuntimeException: Oops!
after execution(void Application.foo())
after execution(void Application.main(String[]))
Run Code Online (Sandbox Code Playgroud)

这应该产生以下输出:

[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by before advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by before advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by before advice from 'LoggerAspect'(LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
before execution(void Application.main(String[]))
before execution(void Application.foo())
before execution(void Application.sayHello(String))
Hello world!
after execution(void Application.sayHello(String))
throwing execution(void Application.sayHello(String))
Caught exception: java.lang.RuntimeException: Oops!
after execution(void Application.foo())
after execution(void Application.main(String[]))
Run Code Online (Sandbox Code Playgroud)

如果您需要更多,-debug也可以将该选项添加到编织器选项中。