diff options
author | Alexander Kriegisch <Alexander@Kriegisch.name> | 2024-01-28 16:13:22 +0700 |
---|---|---|
committer | Alexander Kriegisch <Alexander@Kriegisch.name> | 2024-01-29 07:07:26 +0700 |
commit | f986c3d18386e77c974e4272ab27c3b573773c9b (patch) | |
tree | 542e0be08b7f34133dc9813cef864e5bfb75e31d | |
parent | 8b3a50e5ab8d78e96dd4401081388bc34c17edf4 (diff) | |
download | aspectj-f986c3d18386e77c974e4272ab27c3b573773c9b.tar.gz aspectj-f986c3d18386e77c974e4272ab27c3b573773c9b.zip |
Workaround for defining classes during LTW
Overhaul ClassLoaderWeavingAdaptor to use statically initialised Unsafe
instances and method handles pointing to their 'defineClass' methods.
Those now work universally on JDKs 8-21. In older JDKs, the method used
to be in sun.misc.Unsafe, in more recent ones on jdk.internal.misc.Unsafe.
It is challenging to fetch instances, especially as reflection
protection and module boundaries have been increased in the JDK
progressively. But finally, a solution was adapted from Byte Buddy (BB).
Kudos to BB author Rafael Winterhalter. The previous solution to use
ClassLoader::defineClass and require '--add-opens' is no longer
necessary for the first time since it became necessary in AspectJ 1.9.7
with Java 16 support.
Add org.ow2.asm:asm-common as a dependency everywhere org.ow2.asm:asm
was used before. Maybe that is too many places, but no worse than before.
Add missing dependency on loadtime to aspectjweaver. This kept a build
like "mvn install -am -pl aspectjweaver" from picking up changed
loadtime classes.
Fixes #117.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
29 files changed, 395 insertions, 223 deletions
diff --git a/ajde.core/pom.xml b/ajde.core/pom.xml index 8b147cdcf..474124717 100644 --- a/ajde.core/pom.xml +++ b/ajde.core/pom.xml @@ -46,6 +46,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>testing-util</artifactId> <version>${project.version}</version> diff --git a/ajde/pom.xml b/ajde/pom.xml index dd552c5af..44428acc4 100644 --- a/ajde/pom.xml +++ b/ajde/pom.xml @@ -37,6 +37,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>org.aspectj.ajdt.core</artifactId> <version>${project.version}</version> diff --git a/ajdoc/pom.xml b/ajdoc/pom.xml index cb22d2145..f183c37e9 100644 --- a/ajdoc/pom.xml +++ b/ajdoc/pom.xml @@ -59,6 +59,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>testing-util</artifactId> <version>${project.version}</version> diff --git a/aspectjtools/pom.xml b/aspectjtools/pom.xml index 2280deb3f..12d18fecf 100644 --- a/aspectjtools/pom.xml +++ b/aspectjtools/pom.xml @@ -365,6 +365,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>runtime</artifactId> <version>${project.version}</version> diff --git a/aspectjweaver/aspectjweaver-assembly.xml b/aspectjweaver/aspectjweaver-assembly.xml index 576bb2700..877ddf6b1 100644 --- a/aspectjweaver/aspectjweaver-assembly.xml +++ b/aspectjweaver/aspectjweaver-assembly.xml @@ -17,6 +17,7 @@ <useProjectArtifact>false</useProjectArtifact> <includes> <include>org.ow2.asm:asm</include> + <include>org.ow2.asm:asm-commons</include> </includes> </dependencySet> </dependencySets> diff --git a/aspectjweaver/pom.xml b/aspectjweaver/pom.xml index 34cefc74c..c5702e2aa 100644 --- a/aspectjweaver/pom.xml +++ b/aspectjweaver/pom.xml @@ -390,9 +390,18 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>org.aspectj</groupId> + <artifactId>loadtime</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> </dependencies> </project> diff --git a/loadtime/pom.xml b/loadtime/pom.xml index e73382812..549ee286d 100644 --- a/loadtime/pom.xml +++ b/loadtime/pom.xml @@ -42,6 +42,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>testing-util</artifactId> <version>${project.version}</version> diff --git a/loadtime/src/main/java/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java b/loadtime/src/main/java/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java index ad700fcfd..9a1052075 100644 --- a/loadtime/src/main/java/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java +++ b/loadtime/src/main/java/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java @@ -11,23 +11,16 @@ package org.aspectj.weaver.loadtime; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.security.ProtectionDomain; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; -import java.util.StringTokenizer; import org.aspectj.bridge.AbortException; import org.aspectj.bridge.Constants; @@ -54,6 +47,9 @@ import org.aspectj.weaver.tools.TraceFactory; import org.aspectj.weaver.tools.WeavingAdaptor; import org.aspectj.weaver.tools.cache.WeavedClassCache; +import org.objectweb.asm.*; +import org.objectweb.asm.commons.ClassRemapper; +import org.objectweb.asm.commons.Remapper; import sun.misc.Unsafe; /** @@ -1029,156 +1025,243 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { } } - private Unsafe unsafe; + private static final Object lock = new Object(); - private Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException { - if (unsafe == null) { - Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe"); - theUnsafeField.setAccessible(true); - return (Unsafe) theUnsafeField.get(null); - } - return unsafe; - } + /** + * Instance of either {@link sun.misc.Unsafe} or {@link jdk.internal.misc.Unsafe}. Luckily, both types have + * {@code defineClass} methods with identical signatures. I.e., method handle {@link #defineClassMethodHandle} can be + * invoked with the same set of parameters for both types. + */ + private static Object unsafeInstance = null; - private static Method bindTo_Method, invokeWithArguments_Method = null; - private static Object defineClassMethodHandle = null; + /** + * Method handle for defining new classes in arbitrary class loaders. For invocation, use in connection with + * {@link #unsafeInstance}. + */ + private static MethodHandle defineClassMethodHandle; - private static Boolean initializedForJava11 = false; + static { + try { + createDefineClassMethodHandle(); + } + catch (Exception initializationError) { + new RuntimeException( + "The aspect weaver cannot determine any valid method to define auxiliary classes in arbitrary class loaders. " + + "Aspect weaving will *not* work, and you will see subsequent errors. Please search for corresponding " + + "issues at https://github.com/eclipse-aspectj/aspectj/issues. If there are none, please create a new one.", + initializationError + ).printStackTrace(); + } + } - // In order to let this code compile on earlier versions of Java (8), use reflection to discover the elements - // we need to define classes. - private static synchronized void initializeForJava11() { - if (initializedForJava11) return; + /** + * Scaffolding for defining classes in arbitrary class loaders + * <p> + * Inspired by and shamelessly adapted from <a href="https://bit.ly/3w10oH5">Byte Buddy's {@code ClassInjector}</a>. + * Special thanks to Byte Buddy (BB) author Rafael Winterhalter, who briefly mentioned this approach in a + * <a href="https://bit.ly/3SjFOZY">GitHub comment</a> related to JDK issue + * <a href="https://bugs.openjdk.org/browse/JDK-8200559">JDK-8200559</a>. + * <p> + * <b>Background:</b> Instead of BB, we use ASM and reflection as follows: + * <ul> + * <li> + * Create a mirror class for {@link AccessibleObject} with a different package name in a separate, throw-away + * class loader. + * </li> + * <li> + * Use the mirror class to calculate the {@link Unsafe#objectFieldOffset(Field)} for boolean field + * {@link AccessibleObject#override}, which is expected to be identical to the offset of the same field in the + * original class. + * </li> + * <li> + * After we have the offset, we can use it to override the field value in the original class, deactivating access + * checks for {@link jdk.internal.misc.Unsafe#defineClass(String, byte[], int, int, ClassLoader, ProtectionDomain)}, + * the method we need to execute using a method handle. + * </li> + * </ul> + * All these serve the sole purpose enable LTW without {@code --add-opens java.base/java.lang=ALL-UNNAMED} on the + * JVM command line on JDK 16+, which was necessary for AspectJ 1.9.7 (Java 16) to 1.9.21 (Java 21). + * + * @throws Exception if anything goes wrong, trying to determine a usable {@code defineClass} method handle from any + * of the inspected classes + */ + private static synchronized void createDefineClassMethodHandle() throws Exception { + Unsafe publicUnsafeInstance = null; try { - // MethodType defineClassMethodType = MethodType.methodType(Class.class, new Class[]{String.class, byte[].class, int.class, int.class, ProtectionDomain.class}); - Class<?> methodType_Class = Class.forName("java.lang.invoke.MethodType"); - Method methodTypeMethodOnMethodTypeClass = methodType_Class.getDeclaredMethod("methodType", Class.class,Class[].class); - methodTypeMethodOnMethodTypeClass.setAccessible(true); - Object defineClassMethodType = methodTypeMethodOnMethodTypeClass.invoke(null, Class.class, new Class[] {String.class,byte[].class,int.class,int.class,ProtectionDomain.class}); - - // MethodHandles.Lookup methodHandlesLookup = MethodHandles.lookup(); - Class<?> methodHandles_Class = Class.forName("java.lang.invoke.MethodHandles"); - Method lookupMethodOnMethodHandlesClass = methodHandles_Class.getDeclaredMethod("lookup"); - lookupMethodOnMethodHandlesClass.setAccessible(true); - Object methodHandlesLookup = lookupMethodOnMethodHandlesClass.invoke(null); - - // MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, methodHandlesLookup); - Class<?> methodHandlesLookup_Class = Class.forName("java.lang.invoke.MethodHandles$Lookup"); - Method privateLookupMethodOnMethodHandlesClass = methodHandles_Class.getDeclaredMethod("privateLookupIn",Class.class,methodHandlesLookup_Class); - privateLookupMethodOnMethodHandlesClass.setAccessible(true); - Object lookup = privateLookupMethodOnMethodHandlesClass.invoke(null, ClassLoader.class, methodHandlesLookup); - - // MethodHandle defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType); - Method findVirtual_Method = methodHandlesLookup_Class.getDeclaredMethod("findVirtual", Class.class,String.class,methodType_Class); - findVirtual_Method.setAccessible(true); - defineClassMethodHandle = findVirtual_Method.invoke(lookup, ClassLoader.class, "defineClass",defineClassMethodType); - - // clazz = defineClassMethodHandle.bindTo(loader).invokeWithArguments(name, bytes, 0, bytes.length); - Class<?> methodHandle_Class = Class.forName("java.lang.invoke.MethodHandle"); - bindTo_Method = methodHandle_Class.getDeclaredMethod("bindTo", Object.class); - invokeWithArguments_Method = methodHandle_Class.getDeclaredMethod("invokeWithArguments",Object[].class); - - initializedForJava11 = true; - } catch (Exception e) { - e.printStackTrace(); + Field publicUnsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + publicUnsafeField.setAccessible(true); + publicUnsafeInstance = (Unsafe) publicUnsafeField.get(null); + synchronized (lock) { + unsafeInstance = publicUnsafeInstance; + defineClassMethodHandle = createMethodHandle( + "sun.misc.Unsafe", "defineClass", + String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class + ); + } + } + catch (Exception publicUnsafeException) { + if (publicUnsafeInstance == null) + throw publicUnsafeException; + long overrideOffset = getAccessibleObjectOverrideOffset(publicUnsafeInstance); + Class<?> internalUnsafeType = Class.forName("jdk.internal.misc.Unsafe"); + Field internalUnsafeField = internalUnsafeType.getDeclaredField("theUnsafe"); + publicUnsafeInstance.putBoolean(internalUnsafeField, overrideOffset, true); + Method internalUnsafeDefineClassMethod = internalUnsafeType.getMethod( + "defineClass", + String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class + ); + publicUnsafeInstance.putBoolean(internalUnsafeDefineClassMethod, overrideOffset, true); + synchronized (lock) { + unsafeInstance = internalUnsafeField.get(null); + defineClassMethodHandle = createMethodHandle(internalUnsafeDefineClassMethod); + } } } - private void defineClass(ClassLoader loader, String name, byte[] bytes, ProtectionDomain protectionDomain) { - if (trace.isTraceEnabled()) { - trace.enter("defineClass", this, new Object[] { loader, name, bytes }); + private static long getAccessibleObjectOverrideOffset(Unsafe unsafe) + throws IOException, ClassNotFoundException, NoSuchFieldException + { + Objects.requireNonNull(unsafe); + Field overrideField; + try { + overrideField = AccessibleObject.class.getDeclaredField("override"); + } + catch (NoSuchFieldException ignored) { + // On JDK 12+, field AccessibleObject.override is protected from reflection. The work-around is to create a + // mirror class with the same field layout by transforming the original class, so we can calculate the field + // offset of 'override' and set a value in the original class using the now known offset. + Class<?> mirrorClass = getMirrorClass( + "java.lang.reflect.AccessibleObject", "org.aspectj.mirror.AccessibleObject", true + ); + overrideField = mirrorClass.getDeclaredField("override"); + } + return unsafe.objectFieldOffset(overrideField); + } + + public static MethodHandle createMethodHandle(String className, String methodName, Class<?>... argumentTypes) + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException + { + Class<?> clazz = Class.forName(className); + Method method = clazz.getDeclaredMethod(methodName, argumentTypes); + return createMethodHandle(method, false); + } + + public static MethodHandle createMethodHandle(Method method) throws IllegalAccessException { + return createMethodHandle(method, false); + } + + public static MethodHandle createMethodHandle(Method method, boolean setAccessible) + throws IllegalAccessException + { + // Use Method::setAccessible to access private methods. Caveat: This does not work for classes in packages not + // exported to the calling module (for LTW usually the unnamed module). + if (setAccessible) + method.setAccessible(true); + return MethodHandles.lookup().unreflect(method); + } + + @SuppressWarnings("SameParameterValue") + private static Class<?> getMirrorClass(String originalClass, String mirrorClass, boolean removeMethods) + throws IOException, ClassNotFoundException + { + Objects.requireNonNull(originalClass); + Objects.requireNonNull(mirrorClass); + if (mirrorClass.equals(originalClass)) + throw new IllegalArgumentException("Mirror class name must be different from original " + originalClass); + byte[] mirrorClassBytes = getMirrorClassBytes(originalClass, mirrorClass, removeMethods); + ClassLoader mirrorClassLoader = new SingleClassLoader(mirrorClass, mirrorClassBytes); + return mirrorClassLoader.loadClass(mirrorClass); + } + + private static byte[] getMirrorClassBytes(String originalClass, String mirrorClass, boolean removeMethods) + throws IOException, ClassNotFoundException + { + Class<?> aClass = Class.forName(originalClass); + try (InputStream input = aClass.getResourceAsStream(aClass.getSimpleName() + ".class")) { + Objects.requireNonNull(input); + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); + ClassRemapper classRemapper = new ClassRemapper(classWriter, new ClassNameRemapper(originalClass, mirrorClass)); + ClassVisitor classVisitor = removeMethods ? new MethodAndConstructorRemover(classRemapper) : classRemapper; + new ClassReader(input).accept(classVisitor, 0); + return classWriter.toByteArray(); } - Object clazz = null; - debug("generating class '" + name + "'"); - if (LangUtil.is11VMOrGreater()) { - try { - if (!initializedForJava11) { - initializeForJava11(); - } - // Do this: clazz = defineClassMethodHandle.bindTo(loader).invokeWithArguments(name, bytes, 0, bytes.length, protectionDomain); - Object o = bindTo_Method.invoke(defineClassMethodHandle,loader); - clazz = invokeWithArguments_Method.invoke(o, new Object[] {new Object[] {name, bytes, 0, bytes.length, protectionDomain}}); + } - } catch (Throwable t) { - t.printStackTrace(System.err); - warn("define generated class failed", t); - } - } else { - try { - if (defineClassMethod == null) { - synchronized (lock) { - getUnsafe(); - defineClassMethod = - Unsafe.class.getDeclaredMethod("defineClass", String.class,byte[].class,Integer.TYPE,Integer.TYPE, ClassLoader.class,ProtectionDomain.class); - } - } - defineClassMethod.setAccessible(true); - clazz = defineClassMethod.invoke(getUnsafe(), name,bytes,0,bytes.length,loader,protectionDomain); - } catch (LinkageError le) { - le.printStackTrace(); - // likely thrown due to defining something that already exists? - // Old comments from before moving to Unsafe.defineClass(): - // is already defined (happens for X$ajcMightHaveAspect interfaces since aspects are reweaved) - // TODO maw I don't think this is OK and - } catch (Exception e) { - e.printStackTrace(System.err); - warn("define generated class failed", e); - } + private static class ClassNameRemapper extends Remapper { + private final String originalClass; + private final String mirrorClass; + + public ClassNameRemapper(String originalClass, String mirrorClass) { + this.originalClass = originalClass.replace('.', '/'); + this.mirrorClass = mirrorClass.replace('.', '/'); } - if (trace.isTraceEnabled()) { - trace.exit("defineClass", clazz); + @Override + public String map(String internalName) { + return internalName.equals(originalClass) ? mirrorClass : internalName; } } - static Method defineClassMethod; - private static final Object lock = new Object(); + /** + * ASM class visitor removing all methods and constructors from the given class, leaving only the original fields + */ + private static class MethodAndConstructorRemover extends ClassVisitor { + public MethodAndConstructorRemover(ClassRemapper classRemapper) { + super(Opcodes.ASM9, classRemapper); + } -// /* -// This method is equivalent to the following code but use reflection to compile on Java 7: -// MethodHandles.Lookup baseLookup = MethodHandles.lookup(); -// MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, baseLookup); -// MethodHandle defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType); -// handle.bindTo(classLoader).invokeWithArguments(className, classBytes, 0, classBytes.length)); -// */ -//@Override -//@SuppressWarnings("unchecked") -//public <T> Class<T> defineClass(ClassLoader classLoader, String className, byte[] classBytes) { -// Object baseLookup = methodHandlesLookup.invoke(null); -// Object lookup = methodHandlesPrivateLookupIn.invoke(null, ClassLoader.class, baseLookup); -// MethodHandle defineClassMethodHandle = (MethodHandle) lookupFindVirtual.invoke(lookup, ClassLoader.class, "defineClass", defineClassMethodType); -// try { -// return Cast.uncheckedCast(defineClassMethodHandle.bindTo(classLoader).invokeWithArguments(className, classBytes, 0, classBytes.length)); -// } catch (Throwable throwable) { -// throw new RuntimeException(throwable); -// return (Class) defineClassMethodHandle.bindTo(classLoader).invokeWithArguments(className, classBytes, 0, classBytes.length); -// } catch (Throwable e) { -// throw new RuntimeException(e); -// } -//} - - private void defineClass(ClassLoader loader, String name, byte[] bytes){ - defineClass(loader,name,bytes,null);//, ProtectionDomain protectionDomain) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + // Do not visit any methods or constructors, effectively removing them + return null; + } + } + + /** + * Throw-away child classloader with the sole purpose to define a single {@link Class} from the given bytecode + */ + private static class SingleClassLoader extends ClassLoader { + private final String mirrorClass; + private final byte[] mirrorClassBytes; + + private SingleClassLoader(String mirrorClass, byte[] mirrorClassBytes) { + super(SingleClassLoader.class.getClassLoader()); + this.mirrorClass = mirrorClass; + this.mirrorClassBytes = mirrorClassBytes; + } + + @Override + public Class<?> loadClass(String name) throws ClassNotFoundException { + return name.equals(mirrorClass) + ? super.defineClass(null, mirrorClassBytes, 0, mirrorClassBytes.length) + : super.loadClass(name); + } + } + + private void defineClass(ClassLoader loader, String name, byte[] bytes) { + defineClass(loader, name, bytes, null); + } + + private void defineClass(ClassLoader loader, String name, byte[] bytes, ProtectionDomain protectionDomain) { + if (trace.isTraceEnabled()) + trace.enter("defineClass", this, new Object[] { loader, name, bytes }); + debug("generating class '" + name + "'"); + Class<?> definedClass = null; + try { + if (defineClassMethodHandle == null) + throw new RuntimeException("no valid method to define auxiliary classes -> weaver not working"); + definedClass = (Class<?>) defineClassMethodHandle + .bindTo(unsafeInstance) + .invokeWithArguments(name, bytes, 0, bytes.length, loader, protectionDomain); + } + catch (Throwable t) { + t.printStackTrace(System.err); + warn("define generated class failed", t); + } + finally { + if (trace.isTraceEnabled()) + trace.exit("defineClass", definedClass); + } } -// if (trace.isTraceEnabled()) { -// trace.enter("defineClass", this, new Object[] { loader, name, bytes, protectionDomain }); -// } -// Object clazz = null; -// debug("generating class '" + name + "'"); -// try { -// getUnsafe().defineClass(name, bytes, 0, bytes.length, loader, protectionDomain); -// } catch (LinkageError le) { -// // likely thrown due to defining something that already exists? -// // Old comments from before moving to Unsafe.defineClass(): -// // is already defined (happens for X$ajcMightHaveAspect interfaces since aspects are reweaved) -// // TODO maw I don't think this is OK and -// } catch (Exception e) { -// warn("define generated class failed", e); -// } -// -// if (trace.isTraceEnabled()) { -// trace.exit("defineClass", clazz); -// } -// } } diff --git a/org.aspectj.ajdt.core/pom.xml b/org.aspectj.ajdt.core/pom.xml index 6ef954270..6bb09b6eb 100644 --- a/org.aspectj.ajdt.core/pom.xml +++ b/org.aspectj.ajdt.core/pom.xml @@ -67,6 +67,10 @@ <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> </dependencies> <build> diff --git a/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/Ajc.java b/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/Ajc.java index 7f4ae0109..c6d8c99a8 100644 --- a/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/Ajc.java +++ b/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/Ajc.java @@ -38,8 +38,7 @@ import org.aspectj.util.FileUtil; import static java.io.File.pathSeparator; import static java.io.File.separator; -import static org.aspectj.tools.ajc.AjcTestCase.CLASSPATH_ASM; -import static org.aspectj.tools.ajc.AjcTestCase.CLASSPATH_JUNIT; +import static org.aspectj.tools.ajc.AjcTestCase.*; /** * The Ajc class is intended for use as part of a unit-test suite, it drives the AspectJ compiler and lets you check the compilation @@ -74,6 +73,7 @@ public class Ajc { + outputFolder("bcel-builder") + pathSeparator + CLASSPATH_JUNIT + pathSeparator + CLASSPATH_ASM + + pathSeparator + CLASSPATH_ASM_COMMONS + outputFolder("bridge") + outputFolder("loadtime") + outputFolder("weaver") diff --git a/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/AjcTestCase.java b/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/AjcTestCase.java index 9aec7d947..6fb2d2602 100644 --- a/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/AjcTestCase.java +++ b/org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/AjcTestCase.java @@ -70,9 +70,15 @@ public abstract class AjcTestCase extends TestCase { public static final String CLASSPATH_ASM = Arrays.stream(System.getProperty("java.class.path") .split(pathSeparator)) - .filter(path -> path.replace('\\', '/').contains("org/ow2/asm/")) + .filter(path -> path.replace('\\', '/').contains("org/ow2/asm/asm/")) .findFirst() .orElseThrow(() -> new RuntimeException("ASM library not found on classpath")); + public static final String CLASSPATH_ASM_COMMONS = + Arrays.stream(System.getProperty("java.class.path") + .split(pathSeparator)) + .filter(path -> path.replace('\\', '/').contains("org/ow2/asm/asm-commons/")) + .findFirst() + .orElseThrow(() -> new RuntimeException("ASM Commons library not found on classpath")); public static final String CLASSPATH_JDT_CORE = Arrays.stream(System.getProperty("java.class.path") .split(pathSeparator)) @@ -102,6 +108,7 @@ public abstract class AjcTestCase extends TestCase { + pathSeparator + ".." + separator + "lib" + separator + "bcel" + separator + "bcel-verifier.jar" + pathSeparator + CLASSPATH_JDT_CORE + pathSeparator + CLASSPATH_ASM + + pathSeparator + CLASSPATH_ASM_COMMONS // hmmm, this next one should perhaps point to an aj-build jar... + pathSeparator + ".." + separator + "lib" + separator + "test" + separator + "aspectjrt.jar" ; @@ -556,6 +556,11 @@ <version>${asm.version}</version> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + <version>${asm.version}</version> + </dependency> + <dependency> <!-- All modules referencing files inside 'lib' need this dependency --> <groupId>org.aspectj</groupId> <artifactId>lib</artifactId> diff --git a/run-all-junit-tests/pom.xml b/run-all-junit-tests/pom.xml index 537d2db41..f2370f312 100644 --- a/run-all-junit-tests/pom.xml +++ b/run-all-junit-tests/pom.xml @@ -162,6 +162,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>ajde</artifactId> <version>${project.version}</version> diff --git a/taskdefs/pom.xml b/taskdefs/pom.xml index 9e6831a2d..8bc3c35bb 100644 --- a/taskdefs/pom.xml +++ b/taskdefs/pom.xml @@ -43,6 +43,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <!-- Identical to lib/ant/lib/ant.jar, a former system-scoped dependency --> <groupId>ant</groupId> <artifactId>ant</artifactId> diff --git a/testing-drivers/pom.xml b/testing-drivers/pom.xml index a15c3a534..d6975d22b 100644 --- a/testing-drivers/pom.xml +++ b/testing-drivers/pom.xml @@ -38,6 +38,10 @@ <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> </dependencies> <build> diff --git a/testing/pom.xml b/testing/pom.xml index 38784790a..c5e082255 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -53,6 +53,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>testing-client</artifactId> <version>${project.version}</version> diff --git a/testing/src/test/java/org/aspectj/testing/AntSpec.java b/testing/src/test/java/org/aspectj/testing/AntSpec.java index 7a6bd3cd9..33668d509 100644 --- a/testing/src/test/java/org/aspectj/testing/AntSpec.java +++ b/testing/src/test/java/org/aspectj/testing/AntSpec.java @@ -98,9 +98,15 @@ public class AntSpec implements ITestStep { // setup aj.dir "modules" folder p.setUserProperty("aj.root", new File("..").getAbsolutePath()); - // On Java 16+, LTW no longer works without this parameter. Add the argument here and not in AjcTestCase::run, - // because even if 'useLTW' and 'useFullLTW' are not set, we might in the future have tests for weaver attachment - // during runtime. See also docs/release/README-1.8.7.html. + // On Java 16+, LTW did not work on AspectJ 1.9.7 to 1.9.21 without this parameter. So, we added the argument here + // and not in AjcTestCase::run, because without 'useLTW' or 'useFullLTW', there might have been a need for weaver + // attachment during runtime. See also docs/release/README-1.8.7.adoc. + // + // Since AspectJ 1.9.21.1, '--add-opens' is no longer necessary, because we found a workaround for defining + // classes in arbitrary class loaders. But some tests, e.g. AtAjLTWTests.testLTWUnweavable, still use + // ClassLoader::defineClass to inject dynamically generated classes into the current class loader. Therefore, we + // still set the parameters, so they can be used on demand - not for LTW as such, but for class injection. See + // also tests/java5/ataspectj/ataspectj/UnweavableTest.java. // // Attention: Ant 1.6.3 under Linux neither likes "" (empty string) nor " " (space), on Windows it would not be // a problem. So we use "_dummy" Java system properties, even though they pollute the command line. diff --git a/testing/src/test/java/org/aspectj/testing/RunSpec.java b/testing/src/test/java/org/aspectj/testing/RunSpec.java index 593c5b957..4d7526f44 100644 --- a/testing/src/test/java/org/aspectj/testing/RunSpec.java +++ b/testing/src/test/java/org/aspectj/testing/RunSpec.java @@ -68,14 +68,21 @@ public class RunSpec implements ITestStep { if (vmargs == null) vmargs = ""; - // On Java 16+, LTW no longer works without this parameter. Add the argument here and not in AjcTestCase::run, - // because even if 'useLTW' and 'useFullLTW' are not set, we might in the future have tests for weaver attachment - // during runtime. See also docs/release/README-1.8.7.html. + // On Java 16+, LTW did not work on AspectJ 1.9.7 to 1.9.21 without this parameter. So, we added the argument here + // and not in AjcTestCase::run, because without 'useLTW' or 'useFullLTW', there might have been a need for weaver + // attachment during runtime. See also docs/release/README-1.8.7.adoc. + // + // Since AspectJ 1.9.21.1, '--add-opens' is no longer necessary, because we found a workaround for defining + // classes in arbitrary class loaders. But some tests, e.g. AtAjLTWTests.testLTWUnweavable, still use + // ClassLoader::defineClass to inject dynamically generated classes into the current class loader. Therefore, we + // still set the parameters, so they can be used on demand - not for LTW as such, but for class injection. See + // also tests/java5/ataspectj/ataspectj/UnweavableTest.java. // // The reason for setting this parameter for Java 9+ instead of 16+ is that it helps to avoid the JVM printing // unwanted illegal access warnings during weaving in 'useFullLTW' mode, either making existing tests fail or // having to assert on the warning messages. - vmargs += is16VMOrGreater() ? " --add-opens java.base/java.lang=ALL-UNNAMED" : ""; + // + // vmargs += is16VMOrGreater() ? " --add-opens java.base/java.lang=ALL-UNNAMED" : ""; AjcTestCase.RunResult rr = inTestCase.run(getClassToRun(), getModuleToRun(), args, vmargs, getClasspath(), getModulepath(), useLtw, "true".equalsIgnoreCase(usefullltw)); diff --git a/tests/bugs153/pr155033/ant.xml b/tests/bugs153/pr155033/ant.xml index 4f2dfb885..6ef88c87b 100644 --- a/tests/bugs153/pr155033/ant.xml +++ b/tests/bugs153/pr155033/ant.xml @@ -15,8 +15,8 @@ <jvmarg value="-Dorg.aspectj.weaver.Dump.condition=error"/> <sysproperty key="org.aspectj.dump.directory" path="${aj.sandbox}"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> <!-- <jvmarg value="-Dorg.aspectj.tracing.enabled=true"/> diff --git a/tests/bugs153/pr157474/ant-server.xml b/tests/bugs153/pr157474/ant-server.xml index 73db721c9..0ad066679 100644 --- a/tests/bugs153/pr157474/ant-server.xml +++ b/tests/bugs153/pr157474/ant-server.xml @@ -19,8 +19,8 @@ <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-Daj.weaving.verbose=true"/> <jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg value="-Dorg.aspectj.testing.server.debug=true"/>--> <arg path="${aj.sandbox}"/> </java> diff --git a/tests/bugs153/pr158957/ant.xml b/tests/bugs153/pr158957/ant.xml index ca5dbc254..74dac1409 100644 --- a/tests/bugs153/pr158957/ant.xml +++ b/tests/bugs153/pr158957/ant.xml @@ -20,8 +20,8 @@ <jvmarg value="-Dorg.aspectj.tracing.enabled=true"/> <jvmarg value="-Dorg.aspectj.tracing.factory=default"/> <jvmarg value="-Dorg.aspectj.tracing.messages=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> diff --git a/tests/java5/ataspectj/ajc-ant.xml b/tests/java5/ataspectj/ajc-ant.xml index 9fa620572..285082612 100644 --- a/tests/java5/ataspectj/ajc-ant.xml +++ b/tests/java5/ataspectj/ajc-ant.xml @@ -24,8 +24,8 @@ <!-- use META-INF/aop.xml style --> <classpath path="ataspectj/pathentry"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -36,8 +36,8 @@ <java fork="yes" classname="ataspectj.PerClauseTest" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/> --> </java> </target> @@ -48,8 +48,8 @@ <java fork="yes" classname="ataspectj.AroundInlineMungerTest" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!--<jvmarg line="${jdwp}"/>--><!-- uncomment to debug with JDWP --> </java> </target> @@ -60,8 +60,8 @@ <java fork="yes" classname="ataspectj.AroundInlineMungerTest2" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -69,8 +69,8 @@ <java fork="yes" classname="ataspectj.DumpTest" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -80,8 +80,8 @@ <java fork="yes" classname="ataspectj.TestProxyGenerator" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -101,8 +101,8 @@ <pathelement path="${aj.sandbox}/main1.jar"/> </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -119,8 +119,8 @@ <java fork="yes" classname="ataspectj.ltwlog.MainSilent" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> <copy file="ataspectj/ltwlog/aop-verbsoe.xml" tofile="${aj.sandbox}/META-INF/aop.xml" @@ -129,8 +129,8 @@ <java fork="yes" classname="ataspectj.ltwlog.MainVerbose" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> <copy file="ataspectj/ltwlog/aop-verboseandshow.xml" tofile="${aj.sandbox}/META-INF/aop.xml" @@ -139,8 +139,8 @@ <java fork="yes" classname="ataspectj.ltwlog.MainVerboseAndShow" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -160,6 +160,7 @@ <path refid="aj.path"/> </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> + <!-- Necessary, because the test (not AspectJ itself!) uses ClassLoader::defineClass --> <jvmarg value="${aj.addOpensKey}"/> <jvmarg value="${aj.addOpensValue}"/> </java> @@ -175,8 +176,8 @@ <path refid="aj.path"/> </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> <copy file="ataspectj/aop-decptest.xml" @@ -188,8 +189,8 @@ <path refid="aj.path"/> </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -211,8 +212,8 @@ <path refid="aj.path"/> </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -230,8 +231,8 @@ </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-DaspectDeclared=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> <!--Now ensure that the error is not produced when the declaration is made.--> <copy file="ataspectj/ltwreweavable/aop-ltwreweavable-omitted.xml" @@ -244,8 +245,8 @@ </classpath> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-DaspectDeclared=false"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -273,8 +274,8 @@ <classpath refid="aj.path"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-Daj.weaving.verbose=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> </java> </target> @@ -291,8 +292,8 @@ <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-Daj.weaving.verbose=true"/> <jvmarg value="-Djava.util.logging.config.file=${aj.root}/weaver5/testdata/logging.properties"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> diff --git a/tests/java5/ataspectj/ataspectj/UnweavableTest.java b/tests/java5/ataspectj/ataspectj/UnweavableTest.java index 1ef970612..50c877930 100644 --- a/tests/java5/ataspectj/ataspectj/UnweavableTest.java +++ b/tests/java5/ataspectj/ataspectj/UnweavableTest.java @@ -104,6 +104,8 @@ public class UnweavableTest extends TestCase { try { ClassLoader loader = this.getClass().getClassLoader(); + // Needs "--add-opens java.base/java.lang=ALL-UNNAMED" on the JVM command line, injected in Ant build via + // aj.addOpensKey and aj.addOpensValue variables. See also AntSpec::execute. Method def = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class); def.setAccessible(true); Class<?> gen = (Class<?>) def.invoke(loader, "ataspectj.ISomeGen", cw.toByteArray(), 0, cw.toByteArray().length); @@ -127,6 +129,8 @@ public class UnweavableTest extends TestCase { try { ClassLoader loader = this.getClass().getClassLoader(); + // Needs "--add-opens java.base/java.lang=ALL-UNNAMED" on the JVM command line, injected in Ant build via + // aj.addOpensKey and aj.addOpensValue variables. See also AntSpec::execute. Method def = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class); def.setAccessible(true); Class<?> gen = (Class<?>) def.invoke(loader, "ataspectj.unmatched.Gen", cw.toByteArray(), 0, cw.toByteArray().length); diff --git a/tests/ltw/ant-server.xml b/tests/ltw/ant-server.xml index c5f143fea..d4958e3e3 100644 --- a/tests/ltw/ant-server.xml +++ b/tests/ltw/ant-server.xml @@ -14,8 +14,8 @@ <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-Daj.weaving.verbose=true"/> <jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!--<jvmarg value="-Dorg.aspectj.testing.server.debug=true"/>--> <sysproperty key="org.aspectj.dump.directory" path="${aj.sandbox}"/> <arg path="${aj.sandbox}"/> @@ -30,8 +30,8 @@ <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> <jvmarg value="-Daj.weaving.verbose=true"/> <jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!--<jvmarg value="-Dorg.aspectj.testing.server.debug=true"/>--> <sysproperty key="org.aspectj.dump.directory" path="${aj.sandbox}"/> <arg path="${aj.sandbox}"/> diff --git a/tests/ltw/ant.xml b/tests/ltw/ant.xml index 0cae97a36..abaf349d0 100644 --- a/tests/ltw/ant.xml +++ b/tests/ltw/ant.xml @@ -11,8 +11,8 @@ <java fork="yes" classname="HelloWorldWithException" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <jvmarg value="-Dorg.aspectj.tracing.debug=true"/> <!-- <jvmarg value="-Daj.weaving.verbose=true"/> @@ -29,8 +29,8 @@ <java fork="yes" classname="HelloWorldWithException" failonerror="yes"> <classpath refid="aj.path"/> <jvmarg value="-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <jvmarg value="-Dorg.aspectj.tracing.debug=true"/> <!-- <jvmarg value="-Daj.weaving.verbose=true"/> @@ -62,8 +62,8 @@ <jvmarg value="-Dorg.aspectj.tracing.messages=true"/> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -80,8 +80,8 @@ to bootclasspath --> <jvmarg value="-Xbootclasspath/p:${aj.sandbox}"/> <jvmarg value="-Xbootclasspath/a:${aj.bootpath}"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <classpath> <pathelement path="${aj.sandbox}/hello.jar:${aj.sandbox}/handler.jar:${aj.sandbox}/security.jar"/> @@ -109,8 +109,8 @@ <classpath refid="aj.path"/> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -124,8 +124,8 @@ <sysproperty key="org.aspectj.dump.directory" path="${aj.sandbox}"/> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <jvmarg value="-Dorg.aspectj.tracing.factory=default"/> <!-- <jvmarg line="${jdwp}"/>--> </java> diff --git a/tests/pom.xml b/tests/pom.xml index 65d6ddc7a..1489268b1 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -44,6 +44,10 @@ <artifactId>asm</artifactId> </dependency> <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> + <dependency> <groupId>org.aspectj</groupId> <artifactId>weaver</artifactId> <version>${project.version}</version> diff --git a/tests/profiling/build.xml b/tests/profiling/build.xml index aa7db9d0e..23a98c2ba 100644 --- a/tests/profiling/build.xml +++ b/tests/profiling/build.xml @@ -290,8 +290,8 @@ <jvmarg value="${gc.args}"/> <jvmarg value="${hprof.args}"/> <jvmarg value="-javaagent:${aspectj.lib.dir}/aspectjweaver.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <classpath> <pathelement location="${results.dir}/ltw-app"/> <pathelement location="${results.dir}/aspectlib.jar"/> @@ -323,8 +323,8 @@ <arg value="${weave.injar}"/> <jvmarg value="${gc.args}"/> <jvmarg value="-javaagent:${aspectj.lib.dir}/aspectjweaver.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <classpath> <pathelement location="${results.dir}/ltw-app"/> <pathelement location="${results.dir}/aspectlib.jar"/> diff --git a/tests/tracing/ant.xml b/tests/tracing/ant.xml index 6e0ddd78e..687d41b10 100644 --- a/tests/tracing/ant.xml +++ b/tests/tracing/ant.xml @@ -33,8 +33,8 @@ <jvmarg value="-Dorg.aspectj.tracing.messages=true"/> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -48,8 +48,8 @@ <!-- <jvmarg value="-verbose:class"/>--> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -63,8 +63,8 @@ <jvmarg value="-Djava.util.logging.config.file=logging.properties"/> <!-- use META-INF/aop.xml style --> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg line="${jdwp}"/>--> </java> </target> @@ -76,8 +76,8 @@ <jvmarg value="-Dorg.aspectj.tracing.factory=default"/> <jvmarg value="-Dorg.aspectj.tracing.messages=true"/> <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> - <jvmarg value="${aj.addOpensKey}"/> - <jvmarg value="${aj.addOpensValue}"/> +<!-- <jvmarg value="${aj.addOpensKey}"/>--> +<!-- <jvmarg value="${aj.addOpensValue}"/>--> <!-- <jvmarg value="-verbose:class"/>--> <!-- use META-INF/aop.xml style --> <!-- <jvmarg line="${jdwp}"/>--> diff --git a/weaver/pom.xml b/weaver/pom.xml index 657813b8d..f51e590e1 100644 --- a/weaver/pom.xml +++ b/weaver/pom.xml @@ -65,5 +65,9 @@ <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm-commons</artifactId> + </dependency> </dependencies> </project> |