如何使用AspectJ和Tomcat配置加载时编织?
我试着用下一种方式配置加载时织入(用于使用Perf4J进行分析):
1)我将aop.xml
添加到META-INF
文件夹。 部署时,META-INF放置在工件根目录(即MyAppDeployed/META-INF
)中。
2)我将aspectjrt-1.6.1.jar
, aspectjweaver-1.6.1.jar
, commons-jexl-1.1.jar
, commons-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目录下。 这对我来说有所不同。