我们即将开始在生产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>