可重复使用的方面jar

时间:2015-01-12 15:58:55

标签: aop aspectj reusability

我们即将开始在生产Java独立应用程序中使用aspectsJ。所以,我正在尝试提出一个有方面的jar,这样我就可以将它们编织到生产应用程序而无需任何代码更改。 我正在尝试为方面创建一个单独的项目(MyAspects.jar),并将它们包含到现有的java类路径中以最小化代码更改。我将aop.xml添加到生产应用程序jar的META-INF文件夹中。

在运行应用程序时,我使用的是-javaagent:pathto \ aspectjweaver.jar,并在类路径上的文件夹中包含MyAspects.jar。

但是当执行它时,它会出现以下细节错误。包括整个堆栈跟踪。 我使用的是aspectjweaver-1.8.4.jar。

[AppClassLoader@553f5d07] info AspectJ Weaver Version 1.8.4 built on Thursday Nov 6, 2014 at 20:19:21 GMT
[AppClassLoader@553f5d07] info register classloader sun.misc.Launcher$AppClassLoader@553f5d07
[AppClassLoader@553f5d07] info using configuration file:/C:/riskEventLoader/lib/risk-event-loader.jar!/META-INF/aop.xml
[AppClassLoader@553f5d07] info register aspect com.aspect.generic.GenericAspect
Jan 12, 2015 8:37:15 AM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: register definition failed java.lang.RuntimeException: Cannot register non aspect: com$aspect$generic$GenericAspect , com.aspect.generic.GenericAspect
        at org.aspectj.weaver.bcel.BcelWeaver.addLibraryAspect(BcelWeaver.java:219)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerAspects(ClassLoaderWeavingAdaptor.java:485)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerDefinitions(ClassLoaderWeavingAdaptor.java:304)
        at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:171)
        at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:340)
        at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:345)
        at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:319)
        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:113)
        at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:54)
        at sun.instrument.TransformerManager.transform(TransformerManager.java:169)
        at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

编辑(由kriegaex撰写):

我在这里添加了一些以前发布为评论的代码片段,以便使它们更具可读性并使问题符合重新开放的条件。

方面:

请注意,我修复了一些语法错误,即在两个*切入点中缺少前导execution()表示方法返回类型。我还简化了日志记录。

package com.aspect.generic;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class GenericAspect {
    @Pointcut("execution(* *(..))")
    public void myTraceCall() {}

    @Around("execution(* com.test.riskcheck..*(..))")
    public Object myTrace(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        System.out.println("[BEFORE] " + thisJoinPoint);
        Object retVal = null;
        try {
            retVal = thisJoinPoint.proceed();
        } finally {
            System.out.println("[AFTER]  " + thisJoinPoint + " -> retval = " + retVal);
        }
        return retVal;
    }
}

AspectJ LTW配置文件 aop.xml

我也简化了这个文件。由于同样的原因,它仍然暴露出问题的作者发布的问题。

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <aspects>
        <aspect name="com.aspect.generic.GenericAspect"/>
    </aspects>
    <weaver options="-verbose -showWeaveInfo">
        <include within="com.test.riskcheck..*"/>
    </weaver>
</aspectj>

0 个答案:

没有答案