一、前言
我用的是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>
最终,运行成功∩▽∩