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。
我们随后使用
修改构建的 jarjar 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的主要内容,如果未能解决你的问题,请参考以下文章