如何使用AspectJ和Tomcat配置加载时编织?

我试着用下一种方式配置加载时织入(用于使用Perf4J进行分析):

1)我将aop.xml添加到META-INF文件夹。 部署时,META-INF放置在工件根目录(即MyAppDeployed/META-INF )中。

2)我将aspectjrt-1.6.1.jaraspectjweaver-1.6.1.jarcommons-jexl-1.1.jarcommons-logging.jar放到Tomcat/lib文件夹中(起初我尝试了MyAppDeployed/WEB-INF/libs但它也没有用)。

3)我在启动Tomcat时向VM选项添加了-javaagent:C:\apache-tomcat-6.0.33\lib\aspectjweaver-1.6.1.jar

4)我的aop.xml

          

我没有看到任何迹象表明装载时编织发生。 既没有错误报告也没有必要的结果。 我唯一的错误信息是:

 Error occurred during initialization of VM agent library failed to init: instrument Error opening zip file: C:\apache-tomcat-6.0.33\lib\wrong-jar.jar 

如果我在指定javaagent参数时在aspectjweaver-1.6.1.jar名称中输入错误。 如果写得正确 – 不会打印错误信息。

任何想法,我做错了什么?

PS我使用Java 5,我尝试使用1.5.4版本的aspectj完全相同的结果。

如果你想使用加载时间编织,你可以像往常一样用javac编译你的类,然后用(i)ajc编译你的方面。 您可以使用下面的ant任务执行此操作

           

在编译期间在类路径( “master-classpath” )中使用aspectjrt.jar就足够了。

由于$ {src.dir}中的所有Java类,我给iajc提供了一个源列表。 在源列表中只有一行。

sources.lst

 com/xx/yy/zz/LoggingAspect.java 

我设置了一些iajc任务的属性如下

 outxml="true" outjar="jar_file_name" 

当我运行compile-aspect任务时,我有一个jar jar_file_name.jar文件包含

 META-INF/MANIFEST.MF com/xx/yy/zz/LoggingAspect.class META-INF/aop-ajc.xml 

最后将* jar_file_name.jar *添加到Web应用程序的WEB-INF / lib文件夹中。

然后像以前一样用-javaagents:/path_to_aspectjweaver.jar启动Tomcat。

当我将aop.xml(或aop-ajc.xml)直接放在war文件下的META-INF中时,它不起作用。 这种方式(我的意思是将方面类分成jar)对我来说效果很好。

希望这可以帮助。

我试图在Tomcat中解决同样的问题。 除了-javaagent选项之外,还需要确保aop.xml必须位于WEB-INF / classes / META-INF目录下。 这对我来说有所不同。