Corda 3执行deployNodes任务报错:FileNotFoundException相关咨询
解决Corda 3中
deployNodes任务的FileNotFoundException(SerializationWhitelist缺失) 我之前在排查Corda 3的部署问题时,遇到过完全一样的错误——本质上这是因为CorDapp的序列化白名单配置没做好,导致Corda启动时找不到必要的服务配置文件。下面是一步步的解决办法:
1. 确认序列化白名单类正确实现
首先得确保你已经写了继承自SerializationWhitelist的类,并且正确指定了需要序列化的自定义类(比如教程里的IOUState)。举个Kotlin的例子:
package com.example.helloworld import net.corda.core.serialization.SerializationWhitelist class ExampleSerializationWhitelist : SerializationWhitelist { override val whitelist: List<Class<*>> = listOf(IOUState::class.java) }
如果是用Java开发,对应的代码也要保证重写了getWhitelist()方法,返回正确的类列表。
2. 检查META-INF/services配置文件
这是最容易出错的地方:
- 先看项目的
src/main/resources目录下,有没有META-INF/services这个文件夹,没有的话手动创建。 - 在这个文件夹里,创建一个名为
net.corda.core.serialization.SerializationWhitelist的文件(注意文件名要完全一致,大小写也不能错)。 - 文件里只需要写你的白名单类的全限定名,比如:
别加多余的空格、换行或者注释,否则Corda会识别失败。com.example.helloworld.ExampleSerializationWhitelist
3. 清理缓存后重新构建
Windows下打开命令行,进入项目根目录,执行以下命令:
gradlew clean build deployNodes
先执行clean能彻底清除之前构建的缓存,避免旧的错误文件干扰新的构建结果。
4. 确认Corda版本兼容性
确保你的项目依赖的Corda 3版本是稳定版(比如3.3),快照版本可能会有奇怪的兼容性问题。检查build.gradle里的版本配置,保证所有Corda相关依赖的版本统一:
corda_release_group = 'net.corda' corda_release_version = '3.3' corda_gradle_plugins_version = '3.3.0'
为什么会出现这个错误?
Corda的序列化机制要求明确“白名单”来允许自定义类被序列化,而Java的SPI(服务提供者接口)机制会通过META-INF/services下的文件来找到对应的白名单实现类。如果这个文件缺失、路径不对或者内容错误,Corda在启动节点时就会找不到白名单,从而抛出你看到的FileNotFoundException。
内容的提问来源于stack exchange,提问作者Joel




