使用sbt assembly构建Drools胖包运行时遇NullPointerException求助
解决Drools在sbt assembly胖包中运行时的NullPointerException问题
问题根源
你当前的sbt assembly合并策略直接丢弃了所有META-INF目录下的文件,而Drools/Kie框架依赖META-INF/services/org.kie.api.KieServices这类服务注册文件加载KieServices的具体实现类,同时还需要META-INF/kiemodule.xml等模块配置文件。这直接导致KieServices.Factory.get()无法找到实现类返回null,后续调用getKieClasspathContainer()就会抛出空指针异常。
解决方案
修改build.sbt中的assemblyMergeStrategy,针对不同类型的META-INF文件做差异化处理,保留框架必需的文件:
assembly / assemblyMergeStrategy := { // 合并服务注册文件,多个jar可能都有该目录下的文件 case PathList("META-INF", "services", xs@_*) => MergeStrategy.concat // 保留Kie相关的配置文件 case PathList("META-INF", "kiemodule.xml") => MergeStrategy.first case PathList("META-INF", "kiebase.conf") => MergeStrategy.first case PathList("META-INF", "kie.conf") => MergeStrategy.first // 丢弃冲突的签名、清单类文件 case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList("META-INF", xs@_*) if xs.exists(_.matches(".*\\.(SF|DSA|RSA)")) => MergeStrategy.discard case PathList("META-INF", "INDEX.LIST") => MergeStrategy.discard // 其他文件默认采用first策略 case _ => MergeStrategy.first }
额外检查点
- 确保
kie.conf文件放在src/main/resources目录下,保证能被正确打包进jar - 确认所有Drools相关依赖版本统一(你当前使用的8.31.1.Final版本是一致的,无需调整)
修改后重新执行sbt assembly构建胖包,运行即可解决空指针问题。
内容的提问来源于stack exchange,提问作者GSerum_
相关产品推荐
相关产品推荐

