Community
Participate
Working Groups
The compiler crashes when I don't use -noweave to create aspect libraries. Works fine with -noweave. Note, however, that iajc does not accept "noweave" attribute nor "Xnoweave" (filing this part as a separate bug). F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar tracing.jar TraceAspect.java F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar test.jar Test.java F:\aspectj\bugs\1.1\rc1\noweave>ajc -injars test.jar;tracing.jar trouble in: public class TraceAspect extends java.lang.Object: private java.util.logging.Logger _logger public static final TraceAspect ajc$perSingletonInstance static void <clinit>(): INVOKESTATIC TraceAspect.ajc$postClinit ()V (line 4) RETURN end static void <clinit>() public void <init>(): ALOAD_0 // TraceAspect this (line 4) INVOKESPECIAL java.lang.Object.<init> ()V ALOAD_0 // TraceAspect this (line 5) LDC "trace" INVOKESTATIC java.util.logging.Logger.getLogger (Ljava/lang/ String;)Ljava/util/logging/Logger; PUTFIELD TraceAspect._logger Ljava/util/logging/Logger; RETURN (line 4) end public void <init>() public void ajc$before$TraceAspect$ef(org.aspectj.lang.JoinPoint$StaticPart) AdviceAttribute(before, traceMethods(), 4, 239) : ALOAD_1 // org.aspectj.lang.JoinPoint$StaticPart thisJoi nPointStaticPart (line 11) INVOKEINTERFACE org.aspectj.lang.JoinPoint$StaticPart.getSig nature ()Lorg/aspectj/lang/Signature; ASTORE_2 ALOAD_0 // TraceAspect this (line 12) GETFIELD TraceAspect._logger Ljava/util/logging/Logger; GETSTATIC java.util.logging.Level.INFO Ljava/util/logging/Le vel; ALOAD_2 // org.aspectj.lang.Signature sig INVOKEINTERFACE org.aspectj.lang.Signature.getDeclaringType ()Ljava/lang/Class; INVOKEVIRTUAL java.lang.Class.getName ()Ljava/lang/String; ALOAD_2 // org.aspectj.lang.Signature sig (line 13) INVOKEINTERFACE org.aspectj.lang.Signature.getName ()Ljava/l ang/String; LDC "Entering" INVOKEVIRTUAL java.util.logging.Logger.logp (Ljava/util/logg ing/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V (line 12) RETURN (line 14) end public void ajc$before$TraceAspect$ef(org.aspectj.lang.JoinPoint$StaticPar t) public static TraceAspect aspectOf() org.aspectj.weaver.AjAttribute$AjSynth etic@bdb503 : GETSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect; DUP IFNULL L0 ARETURN L0: NEW org.aspectj.lang.NoAspectBoundException DUP INVOKESPECIAL org.aspectj.lang.NoAspectBoundException.<init> ()V ATHROW end public static TraceAspect aspectOf() public static boolean hasAspect() org.aspectj.weaver.AjAttribute$AjSyntheti c@119dc16 : GETSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect; IFNULL L0 ICONST_1 IRETURN L0: ICONST_0 IRETURN end public static boolean hasAspect() private static void ajc$postClinit() org.aspectj.weaver.AjAttribute$AjSynth etic@c05d3b : NEW TraceAspect DUP INVOKESPECIAL TraceAspect.<init> ()V PUTSTATIC TraceAspect.ajc$perSingletonInstance LTraceAspect; RETURN end private static void ajc$postClinit() end public class TraceAspect ABORT Exception thrown from AspectJ 1.1rc1 This might be logged as a bug already -- find current bugs at http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler Bugs for exceptions thrown have titles File:line from the top stack, e.g., "SomeFile.java:243" If you don't find the exception below in a bug, please add a new bug at http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ To make the bug a priority, please include a test program that can reproduce this exception. already woven: public class TraceAspect already woven: public class TraceAspect java.lang.RuntimeException: already woven: public class TraceAspect at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:23 9) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:76 ) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:321) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:302) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:254) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenerat eClassFiles(AjBuildManager.java:394) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBu ildManager.java:149) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:55) at org.aspectj.tools.ajc.Main.run(Main.java:216) at org.aspectj.tools.ajc.Main.runMain(Main.java:155) at org.aspectj.tools.ajc.Main.main(Main.java:72) 1 fail|abort =================== Now with -noweave ================== F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar tracing.jar -noweave TraceAspect.java F:\aspectj\bugs\1.1\rc1\noweave>ajc -outjar test.jar Test.java F:\aspectj\bugs\1.1\rc1\noweave>ajc -injars test.jar;tracing.jar F:\aspectj\bugs\1.1\rc1\noweave>java Test Apr 10, 2003 12:52:26 AM Test main INFO: Entering === TraceAspect.java === import java.util.logging.*; import org.aspectj.lang.*; public aspect TraceAspect { private Logger _logger = Logger.getLogger("trace"); pointcut traceMethods() : execution(* *.*(..)) && !within(TraceAspect); before() : traceMethods() { Signature sig = thisJoinPointStaticPart.getSignature(); _logger.logp(Level.INFO, sig.getDeclaringType().getName(), sig.getName(), "Entering"); } } === Test.java === public class Test { public static void main(String[] args) { } }
This is correct compiler behavior, but absolutely horrible error handling. This is being listed as a P3 bug but will hopefully be fixed for 1.1 anyway. You should only be able to pass files compiled with -noweave as an input to - injars. This test is only enforced for code that contains aspects or was actually woven into. The expected model is to provide aspect libraries using the -aspectpath option. This way you can ensure that the aspect library code will not be modified by any weaving process and the same binary library can be used for weaving with multiple targets. I'd recommend a process such as: ajc -outjar tracing.jar TraceAspect.java ajc -aspectpath tracing.jar Test.java
fixed in tree, and test in new/options11 This now produces a nice error message instead of an exception.