Drools 7.4.1 kieservices.factory.get() 返回 null

Posted

技术标签:

【中文标题】Drools 7.4.1 kieservices.factory.get() 返回 null【英文标题】:Drools 7.4.1 kieservices.factory.get() returns null 【发布时间】:2018-05-13 08:46:36 【问题描述】:

我尝试将 Drools 7.4.1 集成到 tomcat 中的 webapp 中。

当我在代码中调用以下语句以获取 KieService 时,我得到 null

KieServices ks = KieServices.Factory.get();

当从测试方法调用相同的方法时,没问题。

有人可以帮忙吗?

【问题讨论】:

网络服务器上不是所有的 Drools jars? 我在 webapp 中有这些库 drools-compilerdrools-coredrools-compilerdrools-决策表drools-templates 【参考方案1】:

您必须在依赖项中添加drools-compiler

    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>7.4.1</version>
    </dependency>

【讨论】:

【参考方案2】:

感谢 nicole.torres 的提示。

对于这个问题,我们可以使用 maven-shade-plugin 资源转换器中的 appendingtransformer:

https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer

使用它我们可以附加所有 META-INF/kie.conf 文件。在 ubber jar 中创建 KieBase 或 KieContainer 时遇到空指针的任何人,请访问此线程。我花了三天时间寻找解决方案,并尝试为几乎所有在线可用的该死的流口水示例创建一个 ubber jar :(

【讨论】:

非常感谢。如果其他人正在使用用 maven-shade-plugin 构建的胖 jar,这将修复它。【参考方案3】:

尝试在我们的网络服务器中使用 Drools 时,我们遇到了同样的问题 嵌入式 Grizzly http 服务器。

我们还需要添加 drools-compiler 依赖项,但这并不能解决问题。

由于类路径上有多个来自不同依赖项的 kie.conf 文件,因此 uber-jar 最终只有一个,然后缺少要加载的类的定义。

除了这些来自 drools-core kie.conf 的条目:

org.kie.api.io.KieResources = org.drools.core.io.impl.ResourceFactoryServiceImpl
org.kie.api.marshalling.KieMarshallers = org.drools.core.marshalling.impl.MarshallerProviderImpl
org.kie.api.concurrent.KieExecutors = org.drools.core.concurrent.ExecutorProviderImpl

我们将这些行从 drools-compiler 添加到我们的 uber-jar kie.conf

org.kie.api.KieServices = org.drools.compiler.kie.builder.impl.KieServicesImpl
org.kie.internal.builder.KnowledgeBuilderFactoryService = org.drools.compiler.builder.impl.KnowledgeBuilderFactoryServiceImpl

否则 KieServices 未加载,KieServices.Factory.get() 返回 null。

我们随后使用

修改构建的 jar
jar uf myjar.jar META-INF/kie.conf

修改包含的 kie.conf 文件。我们找不到一个干净的 Maven 集成解决方案。欢迎任何建议...

【讨论】:

【参考方案4】:

根据@Carlos Costa 的建议,以下 pom.xml 中的更改解决了该问题。

总结所有建议,下面是详细的解决方案。 在 pom.xml 中,添加以下内容。

<dependencies>
  <dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>$runtime.version</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <executions>
        <execution>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                <resource>META-INF/kie.conf</resource>
              </transformer>
            </transformers>
          </configuration>
       </execution>
     </executions>
    </plugin>
  </plugins>
</build>

【讨论】:

我们做到了,而且效果很好。 kie.conf 文件最初有 3 行属性。这样做之后,它有大约 25 个(它们都被合并了)。 O,并且Transformer需要添加到Execution部分的Shade插件中。【参考方案5】:

如果您使用 gradle 和 shadow jar 构建,您可以通过修改 shadowJar 任务将 kie.conf 文件附加在一起

shadowJar 
    mergeServiceFiles()
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer) 
      resource = "META-INF/kie.conf"
    

【讨论】:

【参考方案6】:

你必须添加这两个依赖,并且两个依赖的version必须相同

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

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-compiler</artifactId>
  <version>version</version>
</dependency>

【讨论】:

【参考方案7】:

使用最新的drools jar包版本。

  <properties>
        <drools-version>7.16.0.Final</drools-version>
  </properties>
   <dependencies>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>$drools-version</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>$drools-version</version>
        </dependency>
</dependencies>

【讨论】:

【参考方案8】:

这可能是因为您使用的是 uber-jar,正如 nicole.torres 所建议的那样。

另一种解决方案是从您的依赖项(即drools-core、drools-compiler 等)中手动获取所有META-INF/kie.conf 的内容并将它们添加到您的项目src/main/resources/META-INF/kie.conf 文件中。

相对于其他解决方案的优点是打包后不需要手动修改JAR。

如果您没有使用 uber-jar,那么问题可能是其他问题,因为所有依赖项都应该在运行时可用。

【讨论】:

以上是关于Drools 7.4.1 kieservices.factory.get() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

规则引擎 Drools 6.4.0Final版本2

规则引擎 Drools 6.4.0Final版本2

java规则引擎drools6.5.0中kie的概论

规则引擎Drools介绍使用及SpringBoot整合Drools

Drools 规则引擎环境搭建

[Drools]JAVA规则引擎 -- Drools