I tried to configure load-time weaving (for doing profiling with Perf4J) in the next way:
1) I added aop.xml
to META-INF
folder. When deployed, META-INF is placed in the artifact root directory (i.e. MyAppDeployed/META-INF
).
2) I put aspectjrt-1.6.1.jar
, aspectjweaver-1.6.1.jar
, commons-jexl-1.1.jar
, commons-logging.jar
to the Tomcat/lib
folder (at first I tried MyAppDeployed/WEB-INF/libs
but it also didn't work).
3) I added -javaagent:C:\apache-tomcat-6.0.33\lib\aspectjweaver-1.6.1.jar
to VM options when starting Tomcat.
4) My aop.xml
:
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<aspects>
<aspect name="org.perf4j.log4j.aop.TimingAspect"/>
</aspects>
<weaver options="-verbose -showWeaveInfo">
<include within="com.mypackages.MyClass"/>
</weaver>
</aspectj>
I don't see any signs that load-time weaving happens. Neither error-reports nor necessary results. The only error message I have is:
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
in a case when I do a mistake in a aspectjweaver-1.6.1.jar
name when specify a javaagent parameter. If it's written correctly - no error messages are printed.
Any ideas, what am I doing wrong?
P.S. I use Java 5, and I tried the same things with 1.5.4
version of the aspectj with exactly the same results.
Load-time weaving is simply binary weaving deferred until the point that a class loader loads a class file and defines the class to the JVM. To support this, one or more “weaving class loaders” are required. These are either provided explicitly by the run-time environment or enabled using a “weaving agent”.
Load-time weaving (LTW) refers to the process of weaving AspectJ aspects into an application's class files as they are being loaded into the Java virtual machine (JVM).
An aspect weaver is a metaprogramming utility for aspect-oriented languages designed to take instructions specified by aspects (isolated representations of significant concepts in a program) and generate the final implementation code.
What AspectJ does is always pretty much the same: It modifies Java byte code by weaving aspect code into it. In case 1 you just get one set of class files directly from ajc . Case 2.1 creates additional, new class files. Case 2.2 just creates new byte code in memory directly in the JVM.
If you want to use load time weaving, you can first compile your classes with javac as usual then compile your aspect(s) with (i)ajc. You can do this with an ant task like below
<target name="compile-aspect">
<iajc source="1.6" target="1.6" showweaveinfo="true" verbose="true" outxml="true" debug="true" outjar="${dist.dir}/myaspect.jar">
<argfiles>
<pathelement location="${src.dir}/sources.lst"/>
</argfiles>
<classpath>
<path refid="master-classpath" />
</classpath>
</iajc>
</target>
It is enough to have aspectjrt.jar in the classpath ("master-classpath") during compilation.
Since all of my Java classes in ${src.dir}, I give a source list to iajc. In source list there is only one line.
sources.lst
com/xx/yy/zz/LoggingAspect.java
I set some of iajc task's attributes as follows
outxml="true"
outjar="jar_file_name"
When I run compile-aspect task I have a jar jar_file_name.jar file contains
META-INF/MANIFEST.MF
com/xx/yy/zz/LoggingAspect.class
META-INF/aop-ajc.xml
And finally add the *jar_file_name.jar* to your web application's WEB-INF/lib folder.
Then start Tomcat with -javaagents:/path_to_aspectjweaver.jar as you did before.
When I put the aop.xml (or aop-ajc.xml) in META-INF under the war file directly it doesn't work. This way (I mean seperating aspect classes into a jar) just works fine for me.
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With