【问题标题】:Drools 7.4.1 kieservices.factory.get() returns nullDrools 7.4.1 kieservices.factory.get() 返回 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

标签: drools kie


【解决方案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,那么问题可能是其他问题,因为所有依赖项都应该在运行时可用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-21
              • 2020-06-19
              相关资源
              最近更新 更多