通过apachejmeter.jar运行JMeter报错,jmeter.bat运行正常求原因
JMeter两种启动方式的差异及报错原因分析
我有一个使用Parallel Controller(并行控制器)发送多个GET请求的简单JMeter脚本。通过jmeter.bat启动JMeter运行该脚本时无任何报错,但通过bin目录下的apachejmeter.jar运行时出现以下错误,想了解两种运行方式的具体差异:
java.lang.reflect.InaccessibleObjectException: Unable to make field java.lang.ThreadLocal$ThreadLocalMap java.lang.Thread.inheritableThreadLocals accessible: module java.base does not "opens java.lang" to unnamed module @222114ba at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?] at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?] at java.lang.reflect.Field.checkCanSetAccessible(Field.java:180) ~[?:?]
核心差异说明
jmeter.bat启动逻辑:这是官方封装的启动脚本,会自动加载预设的JVM配置参数,其中包含针对Java 9+模块化系统的兼容参数(如--add-opens java.base/java.lang=ALL-UNNAMED)。Parallel Controller依赖反射访问Thread类的内部字段,这些参数恰好解除了模块化带来的访问限制,因此运行无报错。- 直接运行
apachejmeter.jar的问题:直接用java -jar命令启动时,没有带上这些必要的JVM参数。Java 9及以上的模块系统默认禁止反射访问核心类库的内部字段,Parallel Controller需要访问Thread.inheritableThreadLocals,触发了访问限制,从而抛出异常。
直接运行jar的修复方案
如果必须通过jar包直接启动,需手动添加兼容JVM参数:
java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED -jar apachejmeter.jar
这些参数允许JMeter所属的未命名模块访问java.lang和java.util包的内部元素,消除反射访问限制。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

