基于最新父模块开发ODL插件及升级SNMP插件遇问题求助
问题诊断与解决方案
1. ClassCastException 类加载冲突问题
你遇到的ClassCastException是典型的类加载器隔离冲突:同一个DataStorePropertiesContainer类被两个不同类加载器(LeafBindingClassLoader和EquinoxClassLoader)加载,导致JVM判定它们为不同类型,无法互相转换。
解决步骤:
- 修正依赖范围:将所有
org.opendaylight.yang.gen开头的依赖在POM中设置为<scope>provided</scope>。这类类由ODL Karaf容器提供,无需打包进自定义bundle,否则会引发重复加载冲突。 - 统一父POM版本:确认所有模块的父POM都明确指定为
14.0.4,避免混合旧版本依赖。执行mvn dependency:tree检查依赖树,排查并排除版本不一致的旧依赖。 - 清理构建缓存:运行
mvn clean install -DskipTests清理本地仓库旧构建产物,重新生成绑定类。
2. RPC服务注册优化
你当前用Blueprint XML注册RPC的方式在v14版本仍可使用,但更推荐注解驱动的实现方式,简化配置并降低潜在问题:
- 在
GetInterfacesImpl实现类上添加@RpcImplementation注解 - 使用
@Inject注解注入snmp依赖,无需XML配置bean
示例代码:
import org.opendaylight.mdsal.binding.api.RpcImplementation; import javax.inject.Inject; import javax.inject.Singleton; @Singleton @RpcImplementation public class GetInterfacesImpl implements GetInterfaces { private final SnmpService snmp; @Inject public GetInterfacesImpl(SnmpService snmp) { this.snmp = snmp; } // 实现RPC方法逻辑 }
3. Blueprint迁移注解的文档问题
ODL已全面推进从XML Blueprint到注解驱动的开发模式,旧wiki链接失效是因为官方文档已迁移到新平台。你可以通过以下方式获取最新规范:
- 参考ODL官方Binding Specification文档,里面详细说明注解的使用规则
- 查看ODL官方示例项目(如
odl-mdsal-samples),学习注解驱动的RPC、Provider实现方式
4. 新版开发原型推荐
opendaylight-startup-archetype的最新版本已适配ODL Sodium(v14)及后续版本,可直接生成符合最新规范的项目:
mvn archetype:generate \ -DarchetypeGroupId=org.opendaylight.archetypes \ -DarchetypeArtifactId=opendaylight-startup-archetype \ -DarchetypeVersion=1.4.0 \ -DgroupId=org.opendaylight.snmp \ -DartifactId=snmp-plugin \ -Dversion=1.0.0-SNAPSHOT
该版本原型会自动生成正确的父POM依赖、注解驱动的RPC模板,无需手动更新依赖。
内容的提问来源于stack exchange,提问作者Michael James
相关产品推荐
相关产品推荐

