Hi,

My project uses a custom plugin framework, where plugin's are JAR files loaded 
at run-time by the framework using custom class loader. We have several plugin 
JAR files that are to be loaded and AOP looks to be a perfect solution to add a 
particular functionality across plugins.


Following are my Aspect definition and other implementation details:

package net.XXX.pub.plugin;

@Aspect
public class FatalWarningAdvice
{
    @Around("target(net.XXX.pub.plugin.XXX.XXModelSerializable) && 
call(@ReportFatalError * *(..))")
    public void handleFatalWarning(ProceedingJoinPoint joinPoint) throws 
Throwable {

        XXModelSerializable target = (XXModelSerializable)joinPoint.getTarget();

        try {            
            joinPoint.proceed();
        } catch(Throwable ex) {
            throw new XXPluginException(target.getDetailedErrorMessage(ex));
        }

    }

    /* Adding below method solves my problem, but are there any better way to 
solve this problem ?

    public static FatalWarningAdvice aspectOf() {
        return new FatalWarningAdvice();
    }*/

}

The above aspect is part of public.jar file. I have also defined aop.xml file 
under META-INF folder as follows:

<aspectj>
    <aspects>
        <!-- declare existing aspects to the weaver -->
        <aspect name="net.XXX.pub.plugin.FatalWarningAdvice"/>
    </aspects>
    <weaver options="-showWeaveInfo">
        <include within="com.XXX.plugin..*"/>
        <include within="net.XXX.pub.plugin..*"/> 
    </weaver>
</aspectj>


I want FatalWarningAdvice aspect to be weaved on runtime when plugin's are 
loaded by the plugin framework. Following code demonstrated the same:

private synchronized ClassLoader getClassLoader(String jarName) throws 
IOException {
        ClassLoader classLoader = classLoaders.get(jarName);
        if(null == classLoader) {
            ClassLoader startupClassLoader = 
PluginServiceImpl.class.getClassLoader();
            File jarFile = new File(runtimeJarDir, jarName);
            File aspectJarFile = new File("public.jar");
            //classLoader = new NestedJarClassLoader(jarFile, tmpJarDir, 
startupClassLoader);
            //Below call provides list of URLs that will be input to AspectJ 
weaver.
            List<URL> classURLs = NestedJarClassLoader.getURLList(jarFile, 
tmpJarDir);
            classURLs.add(aspectJarFile.toURI().toURL());
            classLoader = new WeavingURLClassLoader(classURLs.toArray(new 
URL[classURLs.size()]), new URL[]{aspectJarFile.toURI().toURL()}, 
startupClassLoader);
            classLoaders.put(jarName, classLoader);
        }
        return classLoader;
    }

Upon executing the above code I get the following exception:
java.lang.NoSuchMethodError: 
net.XXX.pub.plugin.FatalWarningAdvice.aspectOf()Lnet/XXX/pub/plugin/FatalWarningAdvice;


I could temporarily over come this problem by adding below lines of code in my 
Aspect:
    

    public static FatalWarningAdvice aspectOf() {
        return new FatalWarningAdvice();
    }

Are there any work-around to this problem ? One solution is to use ajc or iajc 
but then I requires change to my build environment. As part of LTW are there 
any possibility to avoid using ajc ?
Introducing ajc in the build process is a pain as it will affect the team, each 
developer has to include the aspectj-tools.jar to ant library (to my 
knowledge). Are there any possibilities for AspectJ to include these methods at 
runtime ?

Thanks in advance
Gokul
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to