CordaService无法加载求助:运行时未初始化该服务
咱们先捋清楚核心问题:你的MyService在NodeDriver调试模式下能正常初始化,但实际启动节点时就没动静,而且日志已经确认cordapp被成功加载了。这种情况基本都是节点的服务扫描机制没识别到你的CordaService类,下面给你几个针对性的解决步骤:
1. 先确认服务类被打包进cordapp的JAR里
首先得排查最基础的问题:你的MyService类有没有被正确打包到my-cordapp-0.1这个JAR里?有时候Gradle这类构建工具可能因为配置疏漏,没把这个类包含进去。你可以手动解压JAR文件,看看io/bluebank/MyService.class这个文件存在不。
如果用Gradle构建,确保你的sourceSets配置没毛病,比如:
sourceSets { main { java { srcDirs = ['src/main/java'] } } }
2. 必须添加SPI配置文件让节点识别服务
Corda是通过SPI(服务提供者接口)机制来自动发现CordaService的,你得在cordapp的resources/META-INF/services目录下创建一个名为net.corda.node.services.api.CordaService的文件,文件里只需要写你的服务类的全限定名就行:
io.bluebank.MyService
这个文件就相当于给节点的扫描器递了个“名片”,告诉它“这是个CordaService,启动的时候记得初始化我”。
3. 检查Corda版本的兼容性
你的日志显示用的是corda-core-3.1-corda,得确认你的MyService代码和这个版本兼容。虽然你在Driver模式下能跑,但实际节点环境可能有版本匹配的细节问题,比如Corda 3.x对@CordaService注解的使用有没有特殊要求?确保你的cordapp依赖版本和节点的Corda版本完全一致。
4. 排查签名相关的配置(如果你的cordapp签过名)
如果你的cordapp是经过签名的,要检查节点配置文件node.conf里的cordappSignerKeys有没有包含对应的签名公钥。要是这里配置不对,节点可能会拒绝加载cordapp里的部分组件(包括你的CordaService)。不过你的日志显示cordapp已经被加载了,这个可能性相对小,但也可以顺手排查下。
验证效果
做完上面的配置后,重新构建cordapp,替换节点cordapp目录里的旧JAR,然后重启节点。如果日志里出现和Driver模式下类似的Installed io.bluebank.MyService Corda service这条记录,就说明问题解决啦。
内容的提问来源于stack exchange,提问作者dazraf

