JDK11下Wildfly11集成JavaMelody1.55.0图表加载失败求助
Java Melody在JDK11+Wildfly11环境下图表加载失败及NoSuchMethodError错误解决
问题背景
我正在维护一个以Wildfly 11为应用服务器、基于JDK 11运行的应用,使用Java Melody 1.55.0作为监控工具。打开Java Melody时图表无法加载,日志中出现如下错误:
ERROR [io.undertow.request] (default task-9) UT005023: Exception handling request to /com.adins.mss.webapp/monitoring: java.lang.NoSuchMethodError: sun.nio.ch.DirectBuffer.cleaner()Lsun/misc/Cleaner; at deployment.com.adins.mss.webapp-1.0.0-SNAPSHOT.war//net.bull.javamelody.RrdNioBackend.unmapFile(RrdNioBackend.java:102) at deployment.com.adins.mss.webapp-1.0.0-SNAPSHOT.war//net.bull.javamelody.RrdNioBackend.close(RrdNioBackend.java:167) at deployment.com.adins.mss.webapp-1.0.0-SNAPSHOT.war//org.jrobin.core.RrdDb.close(RrdDb.java:443) at deployment.com.adins.mss.webapp-1.0.0-SNAPSHOT.war//org.jrobin.core.RrdDbPool.release(RrdDbPool.java:196)
错误含义
这个错误是JDK版本兼容性问题:
sun.nio.ch.DirectBuffer.cleaner()是JDK 8及以前的内部API,在JDK 9及以后版本中被封装为受限内部API,不再对外公开调用;- 你使用的Java Melody 1.55.0依赖的JRobin库仍在调用该已废弃的方法,导致运行时JVM找不到该方法,触发
NoSuchMethodError,最终导致图表无法加载。
解决方法
1. 升级Java Melody版本(推荐)
Java Melody在1.70.0及以后的版本已完全修复JDK 9+的兼容性问题,移除了对sun.misc.Cleaner的依赖。直接将Java Melody升级到最新稳定版(或至少1.70.0以上),即可彻底解决该问题。
2. 添加正确的JVM参数(临时 workaround)
你之前添加的--add-opens java.base/java.lang=ALL-UNNAMED参数不匹配问题场景,需要添加允许访问NIO相关内部API的参数:
--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/sun.misc=ALL-UNNAMED
将这两个参数添加到Wildfly的JVM启动配置中(比如修改standalone.conf或domain.conf里的JAVA_OPTS变量),重启服务器后即可让旧版本Java Melody正常运行。
3. 切换RrdBackend实现
如果暂时无法升级Java Melody,可通过配置让Java Melody使用普通文件IO的后端实现,绕过NIO相关API调用:
在应用的web.xml中添加以下上下文参数:
<context-param> <param-name>javamelody.rrd-backend</param-name> <param-value>FILE</param-value> </context-param>
配置完成后重启应用,Java Melody将使用非NIO的文件后端生成图表,避免触发该错误。
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

