将Drools打包为Fat Jar时出现NullPointerException问题求助
解决Drools打包Fat Jar后KieServices返回Null的问题
问题根源
你遇到的NullPointerException核心原因是Fat Jar打包过程中没有合并所有依赖包内的META-INF/kie.conf文件。
Drools的ServiceDiscoveryImpl组件依赖扫描classpath下所有META-INF/kie.conf来加载核心服务实现(比如KieServicesImpl):
- IDE运行时,classpath是分散的依赖Jar,所以能找到所有相关的kie.conf;
- 打包成Fat Jar后,如果打包工具没有处理同名配置文件的合并,就只会保留你项目自身的kie.conf,导致关键服务没被注册,最终
KieServices.Factory.get()返回null。
从你的日志对比也能明确这点:IDE日志里加载了drools-compiler、kie-internal等Jar的kie.conf,而Fat Jar日志只加载了自身的,缺少了org.drools.compiler.kie.builder.impl.KieServicesImpl这个核心服务的配置项。
解决方案
使用Maven Shade插件打包,并配置资源合并规则来整合所有META-INF/kie.conf文件,具体配置如下:
在你的pom.xml中添加Shade插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <!-- 推荐使用最新稳定版本 --> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并所有META-INF/kie.conf文件,追加内容而非覆盖 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/kie.conf</resource> </transformer> <!-- 指定你的主类,确保Fat Jar可以直接运行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
验证步骤
- 执行
mvn clean package重新打包项目; - 运行新生成的Fat Jar,查看日志会发现
ServiceDiscoveryImpl开始加载所有依赖包的kie.conf,包括drools-compiler中的KieServicesImpl; - 此时
KieServices ks = KieServices.Factory.get();就能正常获取实例,不会返回null。
如果你的项目是Spring Boot项目,也可以使用Spring Boot Maven插件,但需要额外配置resource-transformers来合并kie.conf,不过Shade插件的方式更通用,适用于所有Java Maven项目。
内容的提问来源于stack exchange,提问作者user3639761
相关产品推荐
相关产品推荐

