I have a "fragile" legacy app that is running on JBoss 4. That is to say, that any changes to the app require a full manual regression test which are long and expensive. I'm trying to add some specific logging to the app, so I figured that using AOP to intercept method executions would be the simplest way without altering the binaries.
But here is where I am running into classloading problems when I am trying to advise classes that are already loaded by the classloader by the time my ear gets loaded.
My EAR is structured as the follows:
EAR
- webapp.war
\ WEB-INF/lib
- webstuff.jar
- WebClasses.jar
- struts.jar
- EJB.jar
- utils.jar
JBoss is set to load as parent-first, and modifying the sequence isn't an option.
So I have a few problems here:
1) If I drop my aspect.jar in my EAR/lib folder, and enable LTW on the command line, it is able to successfully advise all my classes in EJB.jar, utils.jar and webstuff.jar. I am even able to advise methods in struts.jar, but unable to use any struts classes as the classloader for the aspect doesn't "see" anything in struts.jar (I get ClassDefNotFoundException).
2) If I move my aspect.jar into my WEB-INF/lib folder, it doesn't successfully advise anything in EJB.jar or utils.jar, I suspect b/c they are loaded prior to the aspect being loaded by the classloader.
My pointcuts are all "execution" pointcuts.
Similarly if I try to advise container classes with "execution" pointcuts, they never seem to trigger.
Is there a simple solution for this? Does one need to take the class-loading sequence into account when using LTW? Thinking outloud, would changing all my "execution" pointcuts to "call" make a difference?
My aop.xml is fairly basic:
<aspectj>
<aspects>
<aspect name="com.security.logger.LoginLogger"/>
<aspect name="com.security.logger.EJBAccessErrorLogger"/>
</aspects>
<weaver options="-verbose">
</weaver>
</aspectj>
Do I need to specify <includes> to the aspectj compiler? I thought all classes were "included" by default.
Thanks!
Eric