Recently I was trying to get working AspectJ on Tomcat 8 using OpenJDK 8. I had selected LTW (Load-Time Waving) approach. Waving is modification of bytecode so that aspect methods may be called.
My intention was to create simple logging aspect that will log traces of all method in certain package. I spent terrible, hot day on it. Coding was simple:
Here goes some memo which will maybe help you:
We use Gradle:
compile("org.aspectj:aspectjrt:1.8.6")
compile("org.aspectj:aspectjweaver:1.8.6")
Tomcat must be launched with -javaagent property. This agent is responsible for on-the-fly waving.
-javaagent:/home/my/path/aspectjweaver-1.8.6.jar
Best is to put it into “JAVA_TOOL_OPTIONS” before starting Tomcat. In Eclipse you can set this variable into Run configuration->Environment.
It is absolutely crucial to have aop.xml on classpath. The path must be exactly “META-INF/aop.xml”. So for my .war project it was not enough to put it into /src/webapp/META-INF/aop.xml because that is not on classpath. I have put it into /src/resources/META-INF/aop.xml and Voila! If this file is not presented, no exception or warning is shown.
It is crucial to have Aspect classes as part of Waving. Otherwise error “java.lang.NoSuchMethodError: com.myutils.MyLogger.aspectOf()” is generated.
Code must be compiled with debug symbols (javac -g) otherwise LTW won’t work. In Eclipse that means to run it in debug mode.
For beginner in AspectJ it was terribly hard to get working solution. One of path I tried was through Spring AOC, but it does not helped because Spring AOC is basically just wrapper of AspectJ waving tooling.
Please note this post is based on 1 day experience with AspectJ ;-) I hope this helps you not to waste time on same pitfalls as I did!