Gradle测试触发AspectJ内部错误:不支持类文件主版本61,求解决方案
问题:执行JUnit单元测试时AspectJ类版本不兼容错误
环境信息
------------------------------------------------------------ Gradle 8.7 ------------------------------------------------------------ Kotlin: 1.9.22 Groovy: 3.0.17 Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023 JVM: 17.0.8 (Oracle Corporation 17.0.8+9-LTS-211) OS: Mac OS X 14.0 x86_64
错误日志
执行./gradlew test-unit -Pci时出现以下错误:
Gradle Test Executor 8 STANDARD_ERROR AspectJ Internal Error: unable to add stackmap attributes. Unsupported class file major version 61 java.lang.IllegalArgumentException: Unsupported class file major version 61 at aj.org.objectweb.asm.ClassReader.<init>(ClassReader.java:195) at aj.org.objectweb.asm.ClassReader.<init>(ClassReader.java:176) at aj.org.objectweb.asm.ClassReader.<init>(ClassReader.java:162) at org.aspectj.weaver.bcel.asm.StackMapAdder.addStackMaps(StackMapAdder.java:42) at org.aspectj.weaver.bcel.LazyClassGen.getJavaClassBytesIncludingReweavable(LazyClassGen.java:764) at org.aspectj.weaver.bcel.BcelWeaver.getClassFilesFor(BcelWeaver.java:1464) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1426) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1196) at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:551) at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:387) at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:116) at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:51) at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244) at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:541) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:168) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.access$100(JUnitPlatformTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:104) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:94)
已尝试的依赖配置
添加以下JUnit相关依赖后问题未解决:
testImplementation("org.junit.platform:junit-platform-console-standalone:1.10.2") testImplementation("org.junit.jupiter:junit-jupiter-api") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") testRuntimeOnly("org.junit.platform:junit-platform-launcher")
解决方案
1. 升级AspectJ到支持Java 17的版本
错误中的Unsupported class file major version 61对应Java 17的类文件版本,旧版AspectJ依赖的ASM库不支持该版本。需要将AspectJ核心依赖升级到1.9.10及以上版本:
// 核心依赖 implementation("org.aspectj:aspectjrt:1.9.20") testImplementation("org.aspectj:aspectjweaver:1.9.20") // 如果使用AspectJ Gradle插件,升级插件版本 plugins { id("io.freefair.aspectj.post-compile-weaving") version "8.6" }
2. 排除冲突的ASM传递依赖
部分第三方库可能引入旧版ASM,导致与AspectJ自带的ASM版本冲突。在build.gradle.kts中添加全局排除:
configurations.all { exclude(group = "org.ow2.asm", module = "asm") exclude(group = "org.ow2.asm", module = "asm-commons") exclude(group = "org.ow2.asm", module = "asm-tree") }
3. 配置测试任务的JVM参数
确保测试任务正确加载AspectJ织入代理,在build.gradle.kts中添加:
tasks.withType<Test> { useJUnitPlatform() // 自动获取aspectjweaver路径并添加JavaAgent参数 jvmArgs("-javaagent:${classpath.find { it.name.startsWith("aspectjweaver") }?.absolutePath}") }
内容的提问来源于stack exchange,提问作者RobertNickel
相关产品推荐
相关产品推荐

