Bug 198181 - LinkageError with pertarget and LTW
Summary: LinkageError with pertarget and LTW
Status: RESOLVED WORKSFORME
Alias: None
Product: AspectJ
Classification: Tools
Component: LTWeaving (show other bugs)
Version: 1.5.3   Edit
Hardware: PC Linux
: P2 normal (vote)
Target Milestone: 1.6.2   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-07-28 02:41 EDT by Igor Fedorenko CLA
Modified: 2008-07-17 13:38 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Igor Fedorenko CLA 2007-07-28 02:41:06 EDT
Consider the following test aspect and class

package m;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect("pertarget(execution( public void m.M.run() ))")
public class A {
	int i;
	@Around("execution( public void m.M.run() )")
	public void count() {
		System.out.println("tick " + (i++));
	}
}
package m;
public class M {
	public void run() {
	}
	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			new M().run();
		}
	}
}

I get error message below when I run these class/aspect with LTW. No error message with compile time weaving. The code appears to work as expected in both cases. Tested with aspectj 1.5.3 and the latest dev build 20070611184800. 

More information:
     [java] loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class definition for name: "m/A$ajcMightHaveAspect"
     [java] java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class definition for name: "m/A$ajcMightHaveAspect"
     [java] 	at java.lang.ClassLoader.defineClass1(Native Method)
     [java] 	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
     [java] 	at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
     [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     [java] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
     [java] 	at java.lang.reflect.Method.invoke(Method.java:597)
     [java] 	at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.defineClass(ClassLoaderWeavingAdaptor.java:745)
     [java] 	at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.access$100(ClassLoaderWeavingAdaptor.java:58)
     [java] 	at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor$1.acceptClass(ClassLoaderWeavingAdaptor.java:129)
     [java] 	at org.aspectj.weaver.tools.WeavingAdaptor$WeavingClassFileProvider$1.acceptResult(WeavingAdaptor.java:702)
     [java] 	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1058)
     [java] 	at org.aspectj.weaver.tools.WeavingAdaptor.getAtAspectJAspectBytes(WeavingAdaptor.java:368)
     [java] 	at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:264)
     [java] 	at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:78)
     [java] 	at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:52)
     [java] 	at sun.instrument.TransformerManager.transform(TransformerManager.java:169)
     [java] 	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
     [java] 	at java.lang.ClassLoader.defineClass1(Native Method)
     [java] 	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
     [java] 	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
     [java] 	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
     [java] 	at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
     [java] 	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
     [java] 	at java.security.AccessController.doPrivileged(Native Method)
     [java] 	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
     [java] 	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
     [java] 	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
     [java] 	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
     [java] 	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
     [java] 	at m.M.run(M.java)
     [java] 	at m.M.main(M.java:11)
Comment 1 Andrew Clement CLA 2008-07-17 13:38:10 EDT
just tried to recreate this but it works fine for me when LTW - could have been fixed by another change given the age of the bug.

Incidentally the code doesn't print tick0/tick1/tick2, it prints tick0/tick0/tick0 and that is because for each invocation of run() a different instance of M is being used.  Creating an M outside the loop and reusing it within the loop produces tick0/tick1/tick2.

I've added this test to the regression suite anyway.