Corda 3运行runNodes启动节点时遇Quasar及反射访问异常求助
runNodes启动节点时的两类问题 我来帮你搞定在Corda 3环境里跑runNodes启动节点时遇到的这两个麻烦——Quasar ClassReader异常和非法反射访问警告,这俩都是Corda 3和高版本JDK不兼容导致的常见问题,下面分别给你对应的解决方案:
一、Quasar ClassReader异常
这个异常的核心原因是Corda 3自带的Quasar版本和JDK9及以上的字节码格式不兼容,Quasar在解析新字节码指令时会抛出错误。这里有两个解决思路:
最稳妥的方案:切换到JDK8运行
Corda 3官方推荐的运行环境就是JDK8,完全适配不会有这类兼容性问题。你可以:- 在IDE里把项目的JDK版本设置为1.8;
- 或者在命令行执行
runNodes前指定JDK8的路径:# Linux/macOS JAVA_HOME=/path/to/jdk8 ./gradlew runNodes # Windows set JAVA_HOME=C:\path\to\jdk8 && gradlew runNodes
适配JDK9+:升级Quasar版本
如果必须用高版本JDK,可以升级Quasar到兼容JDK9+的版本。在你的cordapp项目的build.gradle里,修改Quasar的依赖:dependencies { // 替换原有的Quasar依赖 cordaCompile "org.quasar-analytics:quasar-core:0.7.11" }修改后执行
./gradlew clean build runNodes重新构建运行。
二、非法反射访问警告
你看到的那段警告是因为Corda 3用来打包节点的Capsule工具,在访问JMX内部字段com.sun.jmx.mbeanserver.JmxMBeanServer.mbsInterceptor时,违反了JDK9+的模块系统规则。解决方法如下:
用JDK8规避
同样,JDK8没有模块系统,直接用它运行节点就不会出现这个警告。给JVM添加授权参数(JDK9+适用)
你可以通过指定JVM参数允许这个反射访问,从而抑制警告:- 方法一:在项目的
gradle.properties里添加一行配置:cordaJvmArgs=--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED - 方法二:执行
runNodes时直接传递参数:# Linux/macOS ./gradlew runNodes -PcordaJvmArgs="--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED" # Windows gradlew runNodes -PcordaJvmArgs="--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED"
- 方法一:在项目的
额外建议
Corda 3已经是停止维护的旧版本了,长期使用的话建议升级到Corda 4或更高版本,这些新版本对高版本JDK的兼容性更好,能避免很多这类底层兼容性问题。
内容的提问来源于stack exchange,提问作者Joel

