来自 KieSession.startProcess 的 UnsupportedOperationException

UnsupportedOperationException from KieSession.startProcess

我正在尝试将我们的项目从 Drools 6.5.0.CR2 切换到 7.7.0.Final。 (别问我生产环境用CR版的想法是谁想出来的)

我在更改我的依赖项时没有遇到任何问题(没有编译错误),但我现在遇到问题 运行 我的 drools 网络。我现在从 KieSession.startProcess.

得到一个 UnnsupportedOperationException
java.lang.UnsupportedOperationException
    at org.drools.core.impl.StatefulKnowledgeSessionImpl$DummyInternalProcessRuntime.startProcess(StatefulKnowledgeSessionImpl.java:2166)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:1839)

我在 KieHelper class 中创建我的 kie 会话,我们使用以下构造函数和 getter:

创建
public KieHelper(Collection<File> resources) throws ResolverException {
    this();
    KieFileSystem kfs = this.services.newKieFileSystem();

    for(File f : resources) {
        System.out.println(f.getPath());
        try{
            FileInputStream fis = new FileInputStream(f);

            kfs.write(
                    f.getPath(),
                    this.services.getResources().newInputStreamResource(fis));
        }catch (Exception e) {
            throw new ResolverException(e);
        }
    }

    KieBuilder kieBuilder = this.services.newKieBuilder(kfs).buildAll();

    if (kieBuilder.getResults().hasMessages(Level.ERROR)) {
        List<Message> errors = kieBuilder.getResults().getMessages(Level.ERROR);
        StringBuilder sb = new StringBuilder("Errors:");
        for (Message msg : errors) {
            sb.append("\n  " + prettyBuildMessage(msg));
        }

        throw new ResolverException(sb.toString());
    }

    KieContainer container = services.newKieContainer(services.getRepository().getDefaultReleaseId());
    this.base = container.getKieBase();
}

public KieSession newKieSession() {
    return this.base.newKieSession();
}

然后我尝试在使用 KieHelper 的 class 中像这样启动会话:

KieSession wm = this.kieHelper.newKieSession();

//insert facts into the session

wm.startProcess(this.getRuleId()); //this is throwing the exception

在 Drools 6 中这工作正常。在 drools 7 中没有。我希望有人知道发生了什么事。


编辑 1:

根据 Tibor 的回答,我仔细检查了 class 路径。我们还从仅使用 ant 的构建系统切换,在该系统中,我们使用 class 路径上的 Drools Engine 分发 zip 将所有 jar 文件手动放置在二进制文件文件夹中到 Maven。我按照文档 here.

的描述将依赖项添加到我们的 pm
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-bom</artifactId>
      <type>pom</type>
      <version>7.7.0.Final</version>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-api</artifactId>
  </dependency>
  <dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
  </dependency>
</dependencies>

但是从 maven 查看依赖项,列表要小得多:

来自行家:

antlr-runtime-3.5.2.jar
commons-codec-1.10.jar
drools-compiler-7.7.0.Final.jar
drools-core-7.7.0.Final.jar
ecj-4.4.2.jar
kie-api-7.7.0.Final.jar
kie-internal-7.7.0.Final.jar
kie-soup-commons-7.7.0.Final.jar
kie-soup-maven-support-7.7.0.Final.jar
kie-soup-project-datamodel-api-7.7.0.Final.jar
kie-soup-project-datamodel-commons-7.7.0.Final.jar
mvel2-2.4.0.Final.jar
protobuf-java-2.6.0.jar
slf4j-api-1.7.25.jar
xmlpull-1.1.3.1.jar
xpp3_min-1.1.4c.jar
xstream-1.4.10.jar

来自 Drools 引擎分发 Zip

activation-1.1.1.jar
aether-api-1.1.0.jar
aether-connector-basic-1.1.0.jar
aether-impl-1.1.0.jar
aether-spi-1.1.0.jar
aether-transport-file-1.1.0.jar
aether-transport-http-1.1.0.jar
aether-transport-wagon-1.1.0.jar
aether-util-1.1.0.jar
ant-1.8.4.jar
ant-launcher-1.8.4.jar
antlr-runtime-3.5.2.jar
aopalliance-1.0.jar
cdi-api-1.2.jar
commons-codec-1.10.jar
commons-collections4-4.1.jar
commons-lang3-3.4.jar
curvesapi-1.04.jar
drools-beliefs-7.7.0.Final.jar
drools-compiler-7.7.0.Final.jar
drools-core-7.7.0.Final.jar
drools-decisiontables-7.7.0.Final.jar
drools-persistence-api-7.7.0.Final.jar
drools-persistence-jpa-7.7.0.Final.jar
drools-pmml-7.7.0.Final.jar
drools-scorecards-7.7.0.Final.jar
drools-templates-7.7.0.Final.jar
drools-verifier-7.7.0.Final.jar
ecj-4.4.2.jar
guava-20.0.jar
guice-4.0-no_aop.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
httpclient-4.5.3.jar
httpcore-4.4.6.jar
itext-2.1.7.jar
javassist-3.20.0-GA.jar
javax.inject-1.jar
javax.interceptor-api-1.2.jar
jaxb-core-2.2.11.jar
jaxb-impl-2.2.11.jar
jboss-jaxb-api_2.2_spec-1.0.4.Final.jar
jboss-transaction-api_1.2_spec-1.0.1.Final.jar
jcl-over-slf4j-1.7.25.jar
jsoup-1.8.3.jar
kie-api-7.7.0.Final.jar
kie-ci-7.7.0.Final.jar
kie-internal-7.7.0.Final.jar
kie-soup-commons-7.7.0.Final.jar
kie-soup-maven-integration-7.7.0.Final.jar
kie-soup-maven-support-7.7.0.Final.jar
kie-soup-project-datamodel-api-7.7.0.Final.jar
kie-soup-project-datamodel-commons-7.7.0.Final.jar
maven-aether-provider-3.3.9.jar
maven-artifact-3.3.9.jar
maven-builder-support-3.3.9.jar
maven-compat-3.3.9.jar
maven-core-3.3.9.jar
maven-model-3.3.9.jar
maven-model-builder-3.3.9.jar
maven-plugin-api-3.3.9.jar
maven-repository-metadata-3.3.9.jar
maven-settings-3.3.9.jar
maven-settings-builder-3.3.9.jar
mvel2-2.4.0.Final.jar
org.eclipse.sisu.inject-0.3.2.jar
org.eclipse.sisu.plexus-0.3.2.jar
plexus-cipher-1.7.jar
plexus-classworlds-2.5.2.jar
plexus-component-annotations-1.6.jar
plexus-interpolation-1.21.jar
plexus-sec-dispatcher-1.3.jar
plexus-utils-3.0.22.jar
poi-3.15.jar
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
protobuf-java-2.6.0.jar
slf4j-api-1.7.25.jar
stax-api-1.0-2.jar
wagon-http-3.0.0.jar
wagon-http-shared-3.0.0.jar
wagon-provider-api-3.0.0.jar
xmlbeans-2.6.0.jar
xmlpull-1.1.3.1.jar
xpp3_min-1.1.4c.jar
xstream-1.4.10.jar

我一定是遗漏了文档中没有的 Maven 依赖项。


EDIT2

所以作为测试,我回到了我们旧的 ant only 风格,并将所有 jar 从 drools 引擎分发 zip 添加到依赖项和运行时 classpath 但我仍然得到相同的错误...

查看列表虽然从外观上看都不包含来自 jBPM 的任何内容。查看我们的旧源代码控制系统,我们确实有 6.5.0 的 jbpm jar。我猜这些是分开分发的吗?

(该死的,直到我有 15 个代表我才能发表评论。)

可能是您的项目中没有 jBPM 依赖项。在这种情况下,我认为 Drools 为没有功能的进程使用虚拟提供程序。但我不是 100% 确定这一点。