美文网首页
drools 踩坑

drools 踩坑

作者: 无我_a50f | 来源:发表于2021-03-10 17:24 被阅读0次

1. drools 打包后运行直接报错

Exception in thread "main" java.lang.NullPointerException
        at org.kie.internal.io.ResourceFactory.newByteArrayResource(ResourceFactory.java:66)
        at org.drools.compiler.kie.builder.impl.ZipKieModule.getResource(ZipKieModule.java:61)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.lambda$addFiles$2(AbstractKieProject.java:321)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.packageNameForFile(KieBuilderImpl.java:390)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.isFileInKieBase(KieBuilderImpl.java:381)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.filterFileInKBase(KieBuilderImpl.java:359)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.addFiles(AbstractKieProject.java:321)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:247)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:216)
        at org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:193)
        at org.drools.compiler.kie.builder.impl.AbstractKieModule.createKieBase(AbstractKieModule.java:205)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:470)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:438)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBaseFromKieSessionModel(KieContainerImpl.java:611)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:587)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:510)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:493)
        at com.jeffse.Entrance.main(Entrance.java:36)

经过漫长时间的代码追踪和日志调试发现根本问题在于:

ServiceDiscoveryImpl.getInstance().getServices() 

返回map对象中没有包含

org.kie.api.io.KieResources

于是继续追总源码发现:

加载 org.kie.api.io.KieResources 是从 META-INF/kie.conf 中进行加载

试过直接在 META-INF/ 下创建 kie.conf 结果直接运行报错,打包后 jar包内部也没有替换

于是通过命令直接替换 kie.conf

jar uf target/drools-demo-1.0-jar-with-dependencies.jar META-INF/kie.conf

此问题解决。

2. 报错 mvel

You're trying to compile a Drools asset without mvel. Please add the module

解决思路: 由于直接idea 启动时没有问题,pom.xml 已经包含依赖,那么只有可能是运行时某些 class 加载不进来
打印出

ServiceDiscoveryImpl.getInstance().getServices() 

和直接idea启动差别很大
于是讲 idea 直接启动时加载的类全部在 kie.conf 中配置,问题解决。

3. 自己的 kie.conf 配置文件在此记录下

org.kie.api.KieServices = org.drools.compiler.kie.builder.impl.KieServicesImpl
?org.kie.internal.builder.KnowledgeBuilderFactoryService = org.drools.compiler.builder.impl.KnowledgeBuilderFactoryServiceImpl
?org.kie.internal.builder.JaxbConfigurationFactoryService = org.drools.compiler.builder.impl.JaxbConfigurationFactoryServiceImpl
org.drools.compiler.kie.builder.impl.KieBaseUpdaters = org.drools.compiler.kie.builder.impl.KieBaseUpdatersImpl
org.kie.api.io.KieResources = org.drools.core.io.impl.ResourceFactoryServiceImpl
org.kie.api.internal.runtime.beliefs.KieBeliefs = org.kie.internal.services.KieBeliefsImpl
org.drools.compiler.rule.builder.ConstraintBuilder = org.drools.mvel.MVELConstraintBuilder
org.drools.core.base.FieldAccessorFactory = org.drools.mvel.asm.ClassFieldAccessorFactory
org.kie.api.internal.assembler.KieAssemblers = org.kie.internal.services.KieAssemblersImpl
org.kie.api.internal.runtime.KieRuntimes = org.kie.internal.services.KieRuntimesImpl
org.drools.core.base.CoreComponentsBuilder = org.drools.mvel.MVELCoreComponentsBuilder
org.drools.core.factmodel.ClassBuilderFactory = org.drools.mvel.asm.DefaultClassBuilderFactory
org.kie.api.concurrent.KieExecutors = org.drools.core.concurrent.ExecutorProviderImpl
org.kie.api.internal.weaver.KieWeavers = org.kie.internal.services.KieWeaversImpl

备注:

此处用到的版本是 7.49.0.Final, demo 没有用到其他框架, 例如 springboot 之类,因为业务场景不需要web容器。

pom 文件:

<?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>com.jeffse</groupId>
    <artifactId>drools-demo</artifactId>
    <version>1.0</version>

    <properties>
        <pulsar.version>2.6.0</pulsar.version>
        <java.version>1.8</java.version>
        <drools.version>7.49.0.Final</drools.version>
    </properties>

    <dependencies>
        <!-- in your <dependencies> block -->
        <dependency>
            <groupId>org.apache.pulsar</groupId>
            <artifactId>pulsar-client</artifactId>
            <version>${pulsar.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-mvel</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <!--            <scope>provided</scope>-->
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.conf</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.conf</include>
                    <include>**/*.xml</include>
                    <include>**/*.drl</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <!-- Java Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.jeffse.Entrance</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

项目git地址:

https://gitee.com/experimental_warehouse/drool-demo.git

相关文章

  • drools 踩坑

    1. drools 打包后运行直接报错 经过漫长时间的代码追踪和日志调试发现根本问题在于: 返回map对象中没有...

  • JavaScrip-StepPitGuide《JavaScrip

    《JavaScript踩坑指南》JavaScrip-StepPitGuide? 《JavaScript踩坑指南》 ...

  • 算法踩坑6-二叉搜索树排序

    背景 接上面五篇文章算法踩坑-快速排序 算法踩坑2-插入排序 算法踩坑3-堆排序 算法踩坑4-冒泡排序 ...

  • 算法踩坑5-归并排序

    背景 接上面四篇文章算法踩坑-快速排序 算法踩坑2-插入排序 算法踩坑3-堆排序 算法踩坑4-冒泡排序 来...

  • D1094:踩坑的价值最大化

    是人就会踩坑,不踩坑理论上就不属于人类,踩坑是人之常情,能回头站在坑边反思,才是对踩过的的坑价值最大化的体现,要不...

  • 交互设计师所要避免的几个坑

    前言 工作中难免会踩到几个坑,即使现在不踩以后还会踩,只有踩过才会深刻记住,踩过说明爱过!但是踩过的坑必须把坑填满...

  • 踩坑,使用cocoaPods import导入时没有提示的解决办

    续上篇写的,踩坑,cocoaPods ---- framework not found Pods之后 ,又踩坑了。...

  • 2020-10-19随笔 踩坑0传值

    踩坑:当值传入0时,if条件判断时候会自己转换,记录踩坑。

  • 随笔

    读书啊,就是一个坑踩完了又掉进另一个坑,先说踩读书没用的坑,爬出来了,再踩读书要多的坑,之后再踩读书要精啊,读书要...

  • PHP中的数据类型

    一说到数据类型,这个坑就太多了,多到有哪些坑,有多少坑,不知道自己还会踩哪些坑,以及踩过的坑还会不会再踩,我对...

网友评论

      本文标题:drools 踩坑

      本文链接:https://www.haomeiwen.com/subject/dygwqltx.html