As usual, Andy's answer is much smarter than mine. For them alone it makes sense to be on this list. Just saying... Compliments and thanks, you are one of my personal rock stars. :-)
Alexander Kriegisch Am 16.04.2013 um 17:38 schrieb Andy Clement <andrew.clem...@gmail.com>: > Actually the aspects do not need to be compiled with AspectJ. The aspects can > be compiled with javac. *But* before they are usable they must be 'finished > off' by ajc, but that can be done at loadtime. Here is my example: > > // Code.java > public class Code { > public static void main(String []argv) { > new Code().m(); > } > > public void m() {} > } > > // Doit.java > import org.aspectj.lang.annotation.*; > @Aspect > public class Doit { > @Around("execution(* m(..))") > public void advice() { > System.out.println("advice running"); > } > } > > // META-INF/aop-ajc.xml > <aspectj> > <aspects> > <!-- declare existing aspects to the weaver --> > <aspect name="Doit"/> > </aspects> > <weaver options="-showWeaveInfo"> > <include within="*"/> > </weaver> > </aspectj> > > ==== > > javac Doit.java Code.java > > > java -javaagent:../lib/aspectjweaver.jar Code > > [AppClassLoader@1ef6a746] weaveinfo Join point 'method-execution(void > Code.m())' in Type 'Code' (Code.java:6) advised by around advice from 'Doit' > (Doit.java) > > advice running > > > > The aspect should get 'finished off' (and the necessary aspectOf() and > hasAspect() added) by the weaver just before it gets used. That doesn't seem > to be happening with your setup - does it work for you with the agent? > > On a quick look I think the problem might be that the WeavingURLClassLoader > path into the system doesn't have a concept of unfinished aspects. You could > try additionally including the aspect library in the classURLs list? That > might be enough to remind it that it needs to finish it off. > > cheers > Andy > > > > On 16 April 2013 05:55, Alexander Kriegisch <alexan...@kriegisch.name> wrote: >> Theoretically you can use ajc from aspectjtools.jar and compile on the fly, >> even thought this does not sound so nice. >> >> See my answer at http://stackoverflow.com/a/15837624/1082681 for a code >> sample. >> >> Alexander Kriegisch >> >> Am 16.04.2013 um 14:16 schrieb Ron DiFrango >> <rdifra...@captechconsulting.com>: >> >>> Gokul, >>> >>> Even if you are using load time weaving, the aspects themselves have to be >>> compiled with the aspect compiler. I don't think there is any way around >>> this. >>> >>> Thanks, >>> >>> >>> Ron DiFrango >>> From: aspectj-users-boun...@eclipse.org [aspectj-users-boun...@eclipse.org] >>> on behalf of Gokul [mail_goku...@yahoo.co.in] >>> Sent: Tuesday, April 16, 2013 12:37 AM >>> To: aspectj-users@eclipse.org >>> Subject: [aspectj-users] LTW: Are there any posibilities to avoid using ajc >>> and overcome NoSuchMethodError >>> >>> 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 >> >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@eclipse.org >> https://dev.eclipse.org/mailman/listinfo/aspectj-users > > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users