Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] LTW and AspectOf() NoSuchMethodError

Hi Alex,

As far as I can tell, the call to aspectOf() on the @AspectJ aspect is
coming from a client class that is LTW (i.e. there is no such call in the
original code). The client class is part of a 3rd party jar file.

>From what I understand, LTW classes are supposed to be using the helper
class when needing to invoke such an aspect compiled with plain 1.5 javac. I
thought this call is added automatically as part of the weaving process, but
perhaps I am missing something.

I have successfully been able to use @AspectJ with LTW on my own client
classes, using the same pattern, without adding any aspect related calls to
the client code. It fails, however, when trying to use the same pattern on
the jar class.

Please advise if this looks like a bug and I'll be happy to open a report.

My client program is:
public class AopTest {

    public static void main(String[] args) throws Exception {
        System.out.println("aspect class: " +
SessionAspect.class.getName());
        String configFile = "repotest/repository.xml";
        String repHomeDir = "repotest";

        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory");
        env.put(Context.PROVIDER_URL, "localhost");
        InitialContext ctx = new InitialContext(env);

        RegistryHelper.registerRepository(ctx, "repo", configFile,
repHomeDir, true);
}

The aspect:
@Aspect
public class SessionAspect {
    @Around("execution(*
org.apache.jackrabbit.core.jndi.RegistryHelper.registerRepository(..))")
    public Object report(ProceedingJoinPoint jp) throws Throwable {
        String name = jp.getSignature().getName();
        System.out.println("#### Method = " + name);
        return jp.proceed();
    }
}

aop.xml:
<aspectj>
    <weaver options="-XlazyTjp -verbose -showWeaveInfo">
        <include within="test.*"/>
        <include within="org.apache.jackrabbit.core..*"/>
    </weaver>
    <aspects>
        <aspect name="net.contentobjects.jcr.aop.SessionAspect"/>
        <aspect name="test.DummyAspect"/>
    </aspects>
</aspectj>

The output I am getting is:
aspect class: net.contentobjects.jcr.aop.SessionAspect
info weaving
'org/apache/jackrabbit/core/jndi/provider/DummyInitialContextFactory'
info weaver operating in reweavable mode.  Need to verify any required types
exist.
info weaving 'org/apache/jackrabbit/core/jndi/provider/DummyContext'
info weaver operating in reweavable mode.  Need to verify any required types
exist.
info weaving
'org/apache/jackrabbit/core/jndi/provider/DummyContext$FlatNameParser'
info weaver operating in reweavable mode.  Need to verify any required types
exist.
info weaving 'org/apache/jackrabbit/core/jndi/RegistryHelper'
info weaver operating in reweavable mode.  Need to verify any required types
exist.
weaveinfo Join point 'method-execution(void
org.apache.jackrabbit.core.jndi.RegistryHelper.registerRepository(javax.nami
ng.Context, java.lang.String, java.lang.String, java.lang.String, boolean))'
in Type 'org.apache.jackrabbit.core.jndi.RegistryHelper'
(RegistryHelper.java:57) advised by around advice from
'net.contentobjects.jcr.aop.SessionAspect' (SessionAspect.java)
Exception in thread "main" java.lang.NoSuchMethodError:
net.contentobjects.jcr.aop.SessionAspect.aspectOf()Lnet/contentobjects/jcr/a
op/SessionAspect;
	at
org.apache.jackrabbit.core.jndi.RegistryHelper.registerRepository(RegistryHe
lper.java:1)
	at net.contentobjects.jcr.aop.AopTest.main(AopTest.java:37)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at
com.intellij.rt.execution.application.AppMain.main(AppMain.java:86) 

> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx 
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of 
> Alexandre Vasseur
> Sent: Monday, October 24, 2005 11:30 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: Re: [aspectj-users] LTW and AspectOf() NoSuchMethodError
> 
> Hi
> 
> Perhaps you could post your aspect and the program (client 
> code) snip that calls aspectOf.
> 
> For @AspectJ aspect, assuming you have the source code for 
> it, there is no aspectOf() method. Hence you need to use the 
> Aspects.aspectOf helper methods in your client code.
> This no matter if you are or not using LTW.
> 
> If you have an AJC compiled @AspectJ aspect (thus in binary 
> form) in your project path, you'll see that the aspectOf 
> method does exist on the aspect class. AJC added it when 
> compiling the aspect. Hence the client code can call it 
> directly - but you can also use the helper methods.
> If the @AspectJ aspect was compiled with javac, then this 
> method won't be there, so your only choice is to use the 
> Aspects.aspectof helper.
> And from there again with or without LTW does not changes the 
> situation.
> 
> For regular code style aspect, the aspectOf method is 
> implicit on the aspect itself, so you can call it. Then off 
> course both aspect and client code will have to be compiled 
> with AJC - and then you can use LTW without change.
> 
> One situation can happen: if you have an @Aspect compiled 
> with javac, and some client code using the Aspects.aspectOf 
> helper. Then use that with LTW. If the @Aspect class is not 
> exposed to the weaver for some reason (f.e. you are using a 
> limited form of LTW), the actual aspectOf method cannot be 
> added to the aspect class, and the helper method that 
> reflectively invokes this method will thus fail.
> I think this is a rare case. The message you refer to 
> unfortunately did not end up in a bug report. Feel free to 
> open one if you have a reproductible scenario.
> 
> Alex
> 
> 
> On 10/23/05, Yoav Landman <yoavl@xxxxxxxxxxxx> wrote:
> >
> > I am getting a similar behavior to what is described in 
> > http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg04775.html.
> >
> > Using M4 and load time weaving, I am receiving a NoSuchMethodError 
> > from a weaved class calling aspectOf() on my aspect class.
> >
> > I am trying to weave an external jar file. Compile time 
> weaving using 
> > ajc on the same jar works just fine.
> >
> > According to the docs, I thought that using LTW weaved classes are 
> > supposed to call aspectOf() on the Aspects helper class and 
> not on the aspect itself.
> >
> > Is this correct?
> >
> > Thanks,
> >
> > Yoav
> > _______________________________________________
> > 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