aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ajde.core/pom.xml4
-rw-r--r--ajde/pom.xml4
-rw-r--r--ajdoc/pom.xml4
-rw-r--r--aspectjtools/pom.xml4
-rw-r--r--aspectjweaver/aspectjweaver-assembly.xml1
-rw-r--r--aspectjweaver/pom.xml9
-rw-r--r--loadtime/pom.xml4
-rw-r--r--loadtime/src/main/java/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java373
-rw-r--r--org.aspectj.ajdt.core/pom.xml4
-rw-r--r--org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/Ajc.java4
-rw-r--r--org.aspectj.ajdt.core/src/test/java/org/aspectj/tools/ajc/AjcTestCase.java9
-rw-r--r--pom.xml5
-rw-r--r--run-all-junit-tests/pom.xml5
-rw-r--r--taskdefs/pom.xml4
-rw-r--r--testing-drivers/pom.xml4
-rw-r--r--testing/pom.xml4
-rw-r--r--testing/src/test/java/org/aspectj/testing/AntSpec.java12
-rw-r--r--testing/src/test/java/org/aspectj/testing/RunSpec.java15
-rw-r--r--tests/bugs153/pr155033/ant.xml4
-rw-r--r--tests/bugs153/pr157474/ant-server.xml4
-rw-r--r--tests/bugs153/pr158957/ant.xml4
-rw-r--r--tests/java5/ataspectj/ajc-ant.xml69
-rw-r--r--tests/java5/ataspectj/ataspectj/UnweavableTest.java4
-rw-r--r--tests/ltw/ant-server.xml8
-rw-r--r--tests/ltw/ant.xml24
-rw-r--r--tests/pom.xml4
-rw-r--r--tests/profiling/build.xml8
-rw-r--r--tests/tracing/ant.xml16
-rw-r--r--weaver/pom.xml4
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"
;
diff --git a/pom.xml b/pom.xml
index 823f65ccd..5a62b005e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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>