如何解决AspectJ LTW设置中的错误“找不到指定的方面'AspectLogger'”?

问题描述 投票:0回答:1

我正在尝试设置 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。项目结构:

enter image description here

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%\*"

这是我的 %ASPECT_HOME% 的内容 enter image description here

当我启动 jboss 时,服务器正在启动,并且我的所有 Web 应用程序都已成功部署。尽管我在 -Dorg.aspectj.weaver.loadtime.configuration=%ASPECT_HOME% op.xml 中指定了 aop.xml ,但为了安全起见,我仍然将其保留在 META-INF 中。如果在 JVM 选项中将其删除,并且 META-INF 中只有 aop.xml,那么 weaver 甚至找不到它,jboss 日志中也不会出现任何内容。

请帮助我确定问题所在并帮助让记录器运行。

java jboss aop aspectj instrumentation
1个回答
0
投票

方面类上缺少

@Aspect
注释。

© www.soinside.com 2019 - 2024. All rights reserved.