我正在尝试设置 AspectJ 加载时编织 (LTW) 来记录我的 Java Web 应用程序中的方法执行时间。它是一个使用 Servlet、jsp(未使用 Spring)编写的 Web 应用程序,并部署在使用 Servlet 和 jsp(未使用 Spring)编写的 jBoss EAP 7.2 上。
我创建了一个切面并将其与 aop.xml 配置文件一起打包到 JAR 文件中。但是,当我运行应用程序时,遇到以下错误:找不到指定的方面“com.sample.AspectLogger”。
这是 jBoss 控制台的完整日志:
2024-08-05 09:45:05,159 ERROR [stderr] (MSC service thread 1-2) [ModuleClassLoader@17497425] info AspectJ Weaver Version 1.9.2 built on Wednesday Oct 24, 2018 at 15:43:33 GMT
2024-08-05 09:45:05,160 ERROR [stderr] (MSC service thread 1-2) [ModuleClassLoader@17497425] info register classloader org.jboss.modules.ModuleClassLoader@17497425
2024-08-05 09:45:05,161 ERROR [stderr] (MSC service thread 1-2) [ModuleClassLoader@17497425] info using configuration /C:/apps/jboss-eap-7.2.0/standalone/lib/aop.xml
2024-08-05 09:45:05,163 ERROR [stderr] (MSC service thread 1-2) [ModuleClassLoader@17497425] info register aspect com.sample.AspectLogger
2024-08-05 09:45:05,164 ERROR [stderr] (MSC service thread 1-2) [ModuleClassLoader@17497425] error The specified aspect 'com.sample.AspectLogger' cannot be found
这是我到目前为止所做的。
1。项目结构:
AspectLogger.java
package com.sample;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
public class AspectLogger {
@Around("execution(* com.webservices..*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
return proceed;
}
}
aop.xml
<aspectj>
<weaver options="-verbose -showWeaveInfo">
<include within="com.webservices..*"/>
</weaver>
<aspects>
<aspect name="com.sample.AspectLogger"/>
</aspects>
</aspectj>
要将方面打包为 jar 文件,我在 Eclipse 中将项目导出为 jar,它创建了具有以下结构的 jar。(我必须使用 ajc 命令来编译和打包吗?如果是这样,请为我提供合适的命令。尝试了不同的参数使用ajc将AspectLogger.java编译为AspectLogger.class,但仍然遇到相同的错误。)
C:.
| .classpath
| .project
|
+---com
| \---sample
| AspectLogger.class
|
+---lib
| aspectj-1.9.2.jar
| aspectjrt-1.9.2.jar
| aspectjtools-1.9.2.jar
| aspectjweaver-1.9.2.jar
|
\---META-INF
aop.xml
MANIFEST.MF
Java 代理参数: 我使用以下 JVM 参数来启用 AspectJ 编织:
set "ASPECT_HOME=C:\apps\jboss-eap-7.2.0\standalone\lib"
set "JAVA_OPTS=%JAVA_OPTS% -Djboss.modules.system.pkgs=org.aspectj -Dorg.aspectj.weaver.loadtime.debug=true -Dorg.aspectj.weaver.loadtime.configuration=%ASPECT_HOME%\aop.xml -Xbootclasspath/a:%ASPECT_HOME%\aspectjweaver-1.9.2.jar:%ASPECT_HOME%\SampleLogger.jar -Dorg.aspectj.tracing.enabled=false -Dorg.aspectj.tracing.factory=default"
rem Uncomment below line to enable Aspect load-time weaving
set "JAVA_OPTS=%JAVA_OPTS% -javaagent:%ASPECT_HOME%\aspectjweaver-1.9.2.jar -cp %ASPECT_HOME%\*"
当我启动 jboss 时,服务器正在启动,并且我的所有 Web 应用程序都已成功部署。尽管我在 -Dorg.aspectj.weaver.loadtime.configuration=%ASPECT_HOME% op.xml 中指定了 aop.xml ,但为了安全起见,我仍然将其保留在 META-INF 中。如果在 JVM 选项中将其删除,并且 META-INF 中只有 aop.xml,那么 weaver 甚至找不到它,jboss 日志中也不会出现任何内容。
请帮助我确定问题所在并帮助让记录器运行。
方面类上缺少
@Aspect
注释。