Java升级至17后JMeter报Unsupported class file major version 61错误的解决方法
问题:Java升级至17后JMeter JSR223断言报错Unsupported class file major version 61
近期将Java从1.8版本升级至17版本后,JMeter中的JSR223断言出现错误,此前脚本可正常运行。
错误详情
2023-03-13 12:48:59,523 ERROR o.a.j.a.JSR223Assertion: Problem in JSR223 script: Status-Code-Checker javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: General error during conversion: Unsupported class file major version 61 java.lang.IllegalArgumentException: Unsupported class file major version 61 at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:196) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:177) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:163) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:284) at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81) at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251) at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189) at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169) at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125) at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57) at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44) at org.codehaus.groovy.ast.decompiled.ClassSignatureParser.configureClass(ClassSignatureParser.java:42) at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitSupers(DecompiledClassNode.java:185) at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getGenericsTypes(DecompiledClassNode.java:80) at org.codehaus.groovy.control.GenericsVisitor.checkGenericsUsage(GenericsVisitor.java:131) at org.codehaus.groovy.control.GenericsVisitor.checkGenericsUsage(GenericsVisitor.java:125) at org.codehaus.groovy.control.GenericsVisitor.visitDeclarationExpression(GenericsVisitor.java:104) at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89) at org.codehaus.groovy.ast.CodeVisitorSupport.visitExpressionStatement(CodeVisitorSupport.java:117) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitExpressionStatement(ClassCodeVisitorSupport.java:200) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
JSR223断言脚本
import org.apache.jmeter.assertions.AssertionResult; def failureMessage = ""; def resCode = SampleResult.getResponseCode(); if (!resCode.equals("200")) { failureMessage = "Got Response Code :" + resCode; AssertionResult result = new AssertionResult("Expected Response 200"); result.setFailure(true); result.setFailureMessage(failureMessage); prev.addAssertionResult(result); prev.setSuccessful(false); SampleResult.setStartNextThreadLoop(true); } else { }
当前Java版本
java version "17.0.6" 2023-01-17 LTS Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190) Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)
解决方案
核心原因
Groovy版本过低,不支持Java 17对应的类文件版本(major version 61)。旧版Groovy无法解析Java 17编译的字节码,导致编译错误。
具体解决步骤
升级JMeter版本
使用JMeter 5.5及以上版本,该版本开始正式支持Java 8至17,内置的Groovy版本已更新到兼容Java 17的版本。手动升级Groovy库(不升级JMeter时适用)
- 下载兼容Java 17的Groovy版本(推荐Groovy 4.x系列,如groovy-all-4.0.10.jar)。
- 进入JMeter安装目录下的
lib文件夹,删除所有以groovy-开头的旧jar包。 - 将新下载的Groovy jar包放入
lib文件夹,重启JMeter后重新运行脚本。
脚本优化(可选)
简化脚本,利用JMeter内置变量prev(等同于SampleResult),代码更简洁:if (prev.getResponseCode() != "200") { def failureMessage = "Got Response Code: ${prev.getResponseCode()}" def result = new org.apache.jmeter.assertions.AssertionResult("Expected Response 200") result.setFailure(true) result.setFailureMessage(failureMessage) prev.addAssertionResult(result) prev.setSuccessful(false) prev.setStartNextThreadLoop(true) }
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

