【已解决】:Drools 7,初始化创建报NullPointerException

一、前言

我用的是Drools7.54.0、jdk 11、maven3.8.1;在运行demo的时候遇到了版本、空指针、缺少jar包等问题,具体如下:

java文件:

package com.rulesHello;

import com.pojo.Person;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 * @author qiuyelin
 * @version 1.0
 * @Description: TODO
 * @date 2021/7/1 15:50
 */
public class RulesHello {
    public static void main(String[] args) {
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks = kc.newKieSession("testSession1"); 
        int count = ks.fireAllRules();
        System.out.println("总" + count + "条规则");
        ks.dispose();
    }
}

kmodule.xml

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule" >
    <kbase name="rules" packages="rules.rulesHello">
        <ksession name="testSession1"/>
    </kbase>
</kmodule>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>drools_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <drools.version>7.54.0.Final</drools.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.drools/drools-core -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency> 
        
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        
    </dependencies>

</project>

当我运行的时候,遇到以下Error:


二、Error

1、不支持发行版本5

解决方案:这是因为jdk版本与项目不一致的原因导致,可通过maven的setting文件进行配置jdk版本,我的是11,如下:

 <profile>
      <id>development</id>

      <activation>
        <jdk>11</jdk>
		<activeByDefault>true</activeByDefault>
      </activation>
	  
	  <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
      </properties> 
	  
 </profile>

2、Failed to load class "org.slf4j.impl.StaticLoggerBinder" ;Defaulting to no-operation (NOP) logger implementation

解决方案:根据提示1,可以了解到是缺少slf4j-nop的jar包,因此在pom文件添加依赖就行了,如下:

  <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
  <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.25</version>
  </dependency>

3、KieContainer初始化报NullPointerException

通过提示2,定位到代码块,由此知道是KieContainer这一步初始化出现了空指针异常

解决方案1:首先看pom文件drools相关,必须要有drools-compiler,这个包的主要目的是对规则进行编译、构建等,所以如果构建时报错,可以先看看有没有导入包。

<properties>
        <drools.version>7.54.0.Final</drools.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
 <dependencies>
     <!-- https://mvnrepository.com/artifact/org.drools/drools-core -->
     <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-core</artifactId>
         <version>${drools.version}</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/org.drools/drools-compiler -->
     <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-compiler</artifactId>
         <version>${drools.version}</version>
     </dependency>
</dependencies>

解决方案2:再次运行,如果还报空指针错误,有可能是maven的缓存导致的:先clean 再complete

 再次运行,就不会有空指针错误啦!!

4、 You're trying to compile a Drools asset without mvel. Please add the module org.drools:drools-mvel to your classpath.

根据提示,大致意思是“缺少mvel,请加入drools-mvel”,这是因为版本导致的,在Drools7.44.0开始,将原本在drools-core中的mvel独立出来了,而我用的是Drool7.54.0。

解决方案1:降低Drools版本(我这里不推荐,因为版本总是要迭代更新的,一直用低版本也不是一回事儿啊)

<properties>
    <drools.version>7.10.0.Final</drools.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

解决方案2:添加drools-mvel依赖

<!-- https://mvnrepository.com/artifact/org.drools/drools-mvel -->
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-mvel</artifactId>
    <version>7.54.0.Final</version>
</dependency>

最终,运行成功∩▽∩ 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值