Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] LTW probem with Tomcat / Felix classloader

I fail to understand how/why the Felix classloader would be able to find the aop.xml in the classpath, but not the com.ia.UseProfiler aspect.

I know exactly what you mean, but I have seen classloaders that filter on the kind of thing you are looking for. If I call getResourceAsStream("META-INF/aop.xml") they let it through, if I call getResourceAsStream("com.ia.UseProfiler.class") they say I can't have it because it is a class file.

cheers,
Andy


On 30 July 2013 17:59, Eric Benzacar <eric@xxxxxxxxxxx> wrote:
Hi

[ModuleClassLoader@4e730222] info register classloader org.apache.felix.framework.ModuleImpl$ModuleClassLoader@4e730222
[ModuleClassLoader@4e730222] info using configuration file:/Library/Tomcat/apache-tomcat-6.0.35-jira/webapps/jira/WEB-INF/lib/ia-aspects-0.0.1-SNAPSHOT.jar!/META-INF/aop.xml
[ModuleClassLoader@4e730222] info register aspect com.ia.UseProfiler
Jul 29, 2013 1:48:25 PM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: register definition failed
java.lang.RuntimeException: Cannot register non aspect: com$ia$UseProfiler , com.ia.UseProfiler

implies that the com.ia.UseProfiler aspect couldn't be found. AspectJ isn't trying anything magic, it is using the classloader getResource()/getResourceAsStream() type operations to access the aop.xml and the class files (for the aspect).

On one hand, the explanation makes sense as it seems (I do  not know the app very well), that the Felix classloader is being used to load OSGi plugins from a specific path (outside the app's WEB-INF/lib).  However, if that is the case, how is it finding the aop.xml?  Or is that being inherited from the parent classloader?  Otherwise, I fail to understand how/why the Felix classloader would be able to find the aop.xml in the classpath, but not the com.ia.UseProfiler aspect.

Does that felix classloader offer any extra configuration options?

I know very little about Felix, or how it is configured.  In fact, until I saw thre error, I did not even know that Felix was being used.

Does that just mean you don't have the source? If you have access to the classes you could just binary weave the aspect into the jars before you start it (no source code for the app required):

ajc -inpath inputjar.jar UseProfiler.aj -outjar wovenjar.jar

This means you don't need any LTW and don't need to worry about funky classloaders.

A valid point/option, but the app validates checksums of its jars before running, so that would cause a warning and/or a failure.

Thanks,

Eric


On 29 July 2013 11:07, Eric B <ebenzacar@xxxxxxxxx> wrote:
Hi,

I'm trying to wrap a LTW aspect around a third-party webapp to do some debugging/profiling.  I have no access to change/modify the code, but at least I was hoping to see where/why some things were happening.   The webapp is running under a Tomcat 6.0.35 server.

I tried to write up a small, very innocuous aspect (ie: just prints the name of the method that is being executed) and tested it out with a HelloWorld servlet/webapp .  Everything worked as expected. 

When I tried to use it with the third-party app, things seem to be working properly at first:
<catalina.out snip>
WebappClassLoader@1c23f1bb] info AspectJ Weaver Version 1.7.3 built on Thursday Jun 13, 2013 at 19:41:31 GMT
[WebappClassLoader@1c23f1bb] info register classloader org.apache.catalina.loader.WebappClassLoader@1c23f1bb
[WebappClassLoader@1c23f1bb] info using configuration file:/Library/Tomcat/apache-tomcat-6.0.35-jira/webapps/jira/WEB-INF/lib/ia-aspects-0.0.1-SNAPSHOT.jar!/META-INF/aop.xml
[WebappClassLoader@1c23f1bb] info register aspect com.ia.UseProfiler
....
[WebappClassLoader@1c23f1bb] weaveinfo Join point 'method-execution(int com.credo.linker.user.util.DefaultUserManager.getTotalUserCount())' in Type 'com.credo.linker.user.util.DefaultUserManager' (DefaultUserManager.java:81) advised by after advice from 'com.ia.UseProfiler' (UseProfiler.aj:20)
[WebappClassLoader@1c23f1bb] weaveinfo Join point 'method-execution(java.util.Collection com.credo.linker.user.util.DefaultUserManager.getUsers())' in Type 'com.credo.linker.user.util.DefaultUserManager' (DefaultUserManager.java:88) advised by after advice from 'com.ia.UseProfiler' (UseProfiler.aj:20)
</snip>


However, shortly after, I see the following show up in catalina.out:
[ModuleClassLoader@4e730222] info AspectJ Weaver Version 1.7.3 built on Thursday Jun 13, 2013 at 19:41:31 GMT
[ModuleClassLoader@4e730222] info register classloader org.apache.felix.framework.ModuleImpl$ModuleClassLoader@4e730222
[ModuleClassLoader@4e730222] info using configuration file:/Library/Tomcat/apache-tomcat-6.0.35-jira/webapps/jira/WEB-INF/lib/ia-aspects-0.0.1-SNAPSHOT.jar!/META-INF/aop.xml
[ModuleClassLoader@4e730222] info register aspect com.ia.UseProfiler
Jul 29, 2013 1:48:25 PM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: register definition failed
java.lang.RuntimeException: Cannot register non aspect: com$ia$UseProfiler , com.ia.UseProfiler
at org.aspectj.weaver.bcel.BcelWeaver.addLibraryAspect(BcelWeaver.java:221)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerAspects(ClassLoaderWeavingAdaptor.java:478)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerDefinitions(ClassLoaderWeavingAdaptor.java:303)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:170)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:313)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:318)
at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:292)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:103)
at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:54)
at sun.instrument.TransformerManager.transform(TransformerManager.java:169)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1829)
at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:716)
at org.apache.felix.framework.ModuleImpl.access$200(ModuleImpl.java:73)
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1690)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:634)
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3653)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1812)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1734)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1143)
at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
at java.lang.Thread.run(Thread.java:680)


I'm not entirely sure what is happening, but it appears that the webapp is loading its own classloader (Felix) for use in the application, and that the Felix classloader does not know how to register the aspects.

I am starting tomcat with -javaagent:/path/to/aspectjweaver-1.7.3.jar

Is this a class loader issue in which the Felix classloader does not have access to the aspectjweaver classes?
How do I get around the problem?

My aop.xml is pretty mundane as well:
<aspectj>
  <weaver options="-verbose -showWeaveInfo">
    <include within="com.credo.linker.user.*"/>
  </weaver>

  <aspects>
    <aspect name="com.ia. UseProfiler"/>
  </aspects>
</aspectj>


Thanks!

Eric

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



Back to the top