【问题标题】:Aspectj not working with eclipse LunaAspectj 不适用于 Eclipse Luna
【发布时间】:2014-07-24 19:10:16
【问题描述】:

我正在尝试将 aspectJ 与 eclipse 4.4.0 (Luna) 一起使用。 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");
    }
}

但没有记录任何内容。我错过了什么?

【问题讨论】:

    标签: eclipse eclipse-plugin aspectj


    【解决方案1】:

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

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

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

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

    (尝试在安装工具之前执行最后一步,将抛出 Missing requirements: AspectJ Development Tools Core 2.1.3。 尝试从默认安装 AspectJ 时抛出相同的错误Luna 更新站点。)

    【讨论】:

    • 谢谢你,Arjan,你帮助了我。还有一步一步的教程如何将 AspectJ 开发工具安装到 Eclipse 中。 o7planning.org/web/fe/default/en/document/7174/…
    • 我在 WebSphere 上部署 - 我不确定,但我认为从 Eclipse 运行完整的 maven clean build 很重要,以便让它识别 maven 插件,然后用于“发布" 到服务器进程来识别aspectj。我还从网站上将 aspectJ 库和 maven 插件升级到了最新版本。然后它终于起作用了。因此,如果这些步骤仍然不适合您,请尝试这些方法。
    • 有人让调试器真正工作吗?还是那是不可能的事情?
    【解决方案2】:

    如果您想使用 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!");
        }
    }
    

    方面:

    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);
        }
    }
    

    如何用ajc编译&运行:

    假设您的源文件位于名为 src 的目录中,并且您希望类文件以 bin 结尾,那么您就是这样编译的:

    ajc -sourceroots src -1.7 -d bin -cp aspectjrt.jar
    

    现在运行应用程序:

    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[]))
    

    如何用javac编译&用LTW运行:

    你需要用调试符号编译(-g):

    javac -g -cp aspectjrt.jar -d bin src\*.java
    

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

    <?xml version="1.0" encoding="UTF-8"?>
    <aspectj>
        <aspects>
            <aspect name="LoggerAspect"/>
        </aspects>
        <weaver>
            <include within="*"/>
        </weaver>
    </aspectj>
    

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

    java -javaagent:aspectjweaver.jar -cp bin Application
    

    输出是一样的,但如果你想看到更多,你可以添加其他编织器选项,如

    <weaver options="-verbose -showWeaveInfo">
    

    这应该会产生以下输出:

    [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[]))
    

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

    【讨论】:

    • 我只是在 Eclipse 上做“在服务器上运行...”,所以我认为是在做一个简单的 javac。
    • 你以前用过 AspectJ 吗?我的意思是,你知道多少?请详细说明,所以我知道从哪里开始。你能在没有服务器的情况下先在一个普通的 Java SE 程序上进行测试吗?
    • 好的,我已经大量更新了答案并添加了示例代码以及 CTW 和 LTW 编译和运行说明。我对你的应用服务器一无所知,所以你必须自己弄清楚那里的类路径问题,如果有的话。
    • 感谢您的完整回答。正如您所猜测的,我是 AspectJ 的新手,所以我会尝试您的示例,并尝试找到我的路径。我正在使用 tomcat 作为应用程序服务器。 acj 是什么?
    • ajc,不是acj,一开始我已经解释过了。请仔细阅读。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多