Apache NiFi自定义组件依赖冲突与控制器服务共享问题咨询
问题核心原因
两个问题均由错误的NAR依赖配置触发,违反了NiFi的NAR类加载隔离规则:
- NAR之间通过父类加载器继承实现依赖共享,而非直接引入NAR依赖,直接引入会将依赖NAR的所有类打包进当前NAR,导致构件重复
- 控制器服务的实现类只能存在于独立的服务NAR中,不能传递到处理器NAR的依赖树中,否则每个包含服务实现的NAR都会生成独立的服务bundle,无法跨处理器共享
具体解决方案
1. 修正NAR父加载器配置,解决标准构件重复
不要在处理器NAR的pom.xml中直接添加nifi-standard-services-api-nar的依赖,而是通过nar-maven-plugin的<narParent>配置继承父NAR的类加载器,配置示例如下:
<!-- 所有自定义NAR(处理器NAR、服务NAR)的pom.xml都添加该插件配置 --> <plugin> <groupId>org.apache.nifi</groupId> <artifactId>nar-maven-plugin</artifactId> <version>匹配你使用的NiFi版本号</version> <extensions>true</extensions> <configuration> <!-- 该配置代替直接引入nifi-standard-services-api-nar依赖 --> <narParent> <groupId>org.apache.nifi</groupId> <artifactId>nifi-standard-services-api-nar</artifactId> <version>匹配你使用的NiFi版本号</version> </narParent> </configuration> </plugin>
移除两个处理器NAR pom.xml中直接声明的nifi-standard-services-api-nar依赖,后续构建不会再报文档生成错误,也不会将标准构件打包进自定义处理器NAR,彻底解决重复问题。
2. 拆分服务API与实现,禁止服务实现传递到处理器NAR
你当前的依赖结构必然是处理器直接依赖了CustomCacheService的实现包,导致服务实现被打进处理器NAR,按以下规则拆分模块:
- 新增
customcacheservice-api模块(打包类型jar):仅存放CustomCacheService的接口定义,无任何实现代码 - 原
customcacheservice实现模块(打包类型jar):仅依赖上面的api模块,存放服务实现代码 customcacheservice-nar模块:仅依赖服务实现jar,打包成独立的服务NAR- 两个处理器的jar模块:仅依赖
customcacheservice-api模块,且依赖范围设为provided,绝对不能引入服务实现的依赖 - 两个处理器的NAR模块:不需要引入任何服务相关的依赖,仅依赖自身的处理器jar模块即可
3. 部署验证
部署时将三个NAR同时放到NiFi的lib目录:
- customcacheservice-nar-1.0.0-SNAPSHOT.nar
- querycustomcache-nar-1.0.0-SNAPSHOT.nar
- loadcustomcache-nar-1.0.0-SNAPSHOT.nar
重启NiFi后:
- 标准构件只会出现官方bundle的一份,无重复条目
- 服务列表仅会出现1个
com.example.service.customcacheservicebundle下的CustomCacheService,两个处理器都可以识别并共享该服务的同一个实例
内容的提问来源于stack exchange,提问作者luka_roves
相关产品推荐
相关产品推荐

