You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
}

额外检查点

  1. 确保kie.conf文件放在src/main/resources目录下,保证能被正确打包进jar
  2. 确认所有Drools相关依赖版本统一(你当前使用的8.31.1.Final版本是一致的,无需调整)

修改后重新执行sbt assembly构建胖包,运行即可解决空指针问题。

内容的提问来源于stack exchange,提问作者GSerum_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:05:23