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

Drools 7.4.1.services.factory.get()返回null,drools,kie,Drools,Kie,我尝试将Drools 7.4.1集成到tomcat中的一个Web应用程序中 当我在代码中调用下面的语句以获取服务时,我得到null KieServices ks = KieServices.Factory.get(); 当从测试方法调用相同的方法时,它是ok的 有人能帮忙吗?您必须在依赖项中添加drools编译器 <dependency> <groupId>org.drools</groupId> <artifa

我尝试将Drools 7.4.1集成到tomcat中的一个Web应用程序中

当我在代码中调用下面的语句以获取服务时,我得到
null

KieServices ks = KieServices.Factory.get();
当从测试方法调用相同的方法时,它是ok的


有人能帮忙吗?

您必须在依赖项中添加
drools编译器

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

org.drools
drools编译器
7.4.1

在我们的Web服务器中尝试将Drools用于 嵌入式Grizzly http服务器

我们还需要添加drools编译器依赖项,但仅此一点并不能解决它

因为在不同依赖项的类路径上有多个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编译器中的这些行添加到我们的uber jarkie.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 uf myjar.jar META-INF/kie.conf

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

谢谢你给nicole.torres的小费

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


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

正如@Carlos Costa所建议的,pom.xml中的更改解决了这个问题

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

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

org.drools
drools编译器
${runtime.version}


META-INF/kie.conf

您必须添加这两个依赖项,并且两个依赖项的{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>

org.drools
流涎核
{version}
org.drools
drools编译器
{version}

使用最新的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>


7.16.0.1最终版本
org.drools
drools编译器
${drools版本}
org.drools
流涎核
${drools版本}

正如妮可·托雷斯建议的那样,这可能是因为你使用的是uber罐

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

与其他解决方案相比,它的优势在于打包后不需要手动修改JAR


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

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

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

不是所有的Drools jar都在web服务器上?我在webapp Drools编译器Drools core Drools编译器Drools decisiontables Drools Templates中有这些库。如果其他人使用maven shade插件构建的胖jar,这将修复它。我们这样做了,它成功了。kie.conf文件最初有3行属性,完成后大约有25行(它们都合并在一起)。O,需要将转换器添加到执行部分的Shade插件中。
shadowJar {
    mergeServiceFiles()
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer) {
      resource = "META-INF/kie.conf"
    }
}