ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Drools 7.48.0.Final 环境配置避坑指南:JDK11+Maven3.8.7+WildFly26精准适配

Drools 7.48.0.Final 环境配置避坑指南:JDK11+Maven3.8.7+WildFly26精准适配

简介:本资源为 Drools 规则引擎 7.48.0 Final 官方发行版完整分发包,面向 Java 开发者、企业级规则系统设计人员及微服务架构中需嵌入业务规则能力的中高级工程师。该版本属于 Drools 7.x 系列稳定终版,适用于复杂事件处理(CEP)、决策表建模、规则热部署等典型场景,可支撑风控策略、保险核保、订单路由等业务逻辑的解耦与动态化管理。压缩包为 ZIP 格式,大小 64.01MB,包含完整的二进制库、示例工程、文档及脚本工具,核心文件类型涵盖 JAR(运行时依赖与 API)、XML(规则定义与配置)、JAVADOC(API 参考)及 Shell/BAT 启动脚本,结构规范,开箱即用。目前已有 309 人学习下载,读者可直接获取标准发行版用于本地集成验证、规则调试环境搭建或与 Spring Boot/Kie Server 的对接实践,避免因版本不一致导致的兼容性问题。

1. Drools 7.48.0.Final 安装不是“解压即用”,版本错一档,规则引擎就直接哑火

你手头刚下载完drools-distribution-7.48.0.Final.zip,双击解压、翻到bin/下兴冲冲执行kieserver-start.sh——结果控制台刷出一长串NoClassDefFoundError,最后卡在org.kie.api.KieServices找不到。这不是你的 JDK 没配好,也不是环境变量漏写了,而是 Drools 7.48.0.Final 这个版本对 Java 和 Maven 的兼容边界非常具体:它强制要求 JDK 11(仅支持 11.0.2+,不兼容 JDK 17+)且 Maven 3.8.6+,而网上大量教程还在沿用 JDK 8 + Maven 3.5 的老路径。一旦版本越界,kie-server 启动失败、DRL 文件加载报空指针、甚至 KIE Workbench 页面白屏——这些都不是配置问题,是底层字节码签名和模块系统不匹配导致的硬性拒绝。这套环境特别适合正在做企业级规则中心迁移、需要稳定支撑复杂决策流(比如信贷审批链、保险核保策略树)的后端开发者;也适合某高校实验室在构建可解释 AI 决策沙箱时,需要一个开箱即用、规则热更新可控、且能与 Spring Boot 2.5.x 深度集成的规则引擎底座。别急着改配置,先锁死 JDK 和 Maven 版本,这是 Drools 7.48.0.Final 能跑起来的第一道生死线。

2. 环境筑基:JDK 11 与 Maven 3.8.6 的精准安装与验证

Drools 7.48.0.Final 不是泛兼容型工具,它对运行时环境有明确的语义版本契约。JDK 必须是11.0.2 或更高小版本(如 11.0.22),但绝对不能是 JDK 12 及以上;Maven 必须是3.8.6 或 3.8.7(3.9.x 已移除部分 Drools 构建插件依赖的内部 API)。这两个组件若没踩准,后续所有配置都是空中楼阁。

2.1 安装 JDK 11:只认 OpenJDK 11.0.22 LTS,拒绝 Oracle JDK 11u21

我们不推荐从 Oracle 官网下载带商业许可风险的 JDK,也不建议用某些 Linux 发行版仓库里打包陈旧的openjdk-11-jdk(Ubuntu 20.04 默认是 11.0.11,CentOS 7 是 11.0.19)。实测最稳路径是直接获取 Adoptium Temurin 11.0.22+7 的二进制包:

# 下载并解压(以 Linux x64 为例) wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz tar -xzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz -C /opt/ sudo ln -sf /opt/jdk-11.0.22+7 /opt/java11

提示:/opt/java11是我们约定的 JDK 根路径,后续所有环境变量、Drools 启动脚本都基于此。不要用update-alternatives或修改/usr/bin/java,Drools 启动脚本会主动读取JAVA_HOME,混用会导致kieserver-start.sh内部调用的java -version与实际JAVA_HOME不一致。

验证是否真正生效:

export JAVA_HOME=/opt/java11 export PATH=$JAVA_HOME/bin:$PATH java -version # ✅ 正确输出应为: # openjdk version "11.0.22" 2024-01-16 # OpenJDK Runtime Environment Temurin-11.0.22+7 (build 11.0.22+7) # OpenJDK 64-Bit Server VM Temurin-11.0.22+7 (build 11.0.22+7, mixed mode)

关键点说明:

  • java -version输出中必须含11.0.22字样,且 build 号为+7;
  • 若显示11.0.21或11.0.19,说明你解压错了包或JAVA_HOME指向了旧版本;
  • 若出现Error: Could not create the Java Virtual Machine,大概率是系统架构不匹配(如在 ARM64 机器上用了 x64 包),需重下对应平台二进制。

2.2 安装 Maven 3.8.7:必须禁用默认仓库镜像,否则 KIE 构建必挂

Drools 7.48.0.Final 的构建过程重度依赖org.kie:kie-maven-plugin,该插件在 Maven 3.8.6+ 中被重构,但其依赖的maven-resolver组件与国内某些镜像站(如阿里云、华为云)返回的元数据格式存在解析冲突,会导致mvn clean install卡在Downloading from aliyun: https://maven.aliyun.com/repository/public/org/kie/kie-maven-plugin/maven-metadata.xml并最终超时失败。

正确做法是使用官方二进制 + 自定义settings.xml强制直连中央仓库:

# 下载 Maven 3.8.7 wget https://dlcdn.apache.org/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz tar -xzf apache-maven-3.8.7-bin.tar.gz -C /opt/ sudo ln -sf /opt/apache-maven-3.8.7 /opt/maven387 # 创建专用 settings.xml(绕过所有镜像) mkdir -p ~/.m2 cat > ~/.m2/settings.xml << 'EOF' <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>/home/$(whoami)/.m2/repository</localRepository> <mirrors> <!-- ⚠️ 关键:注释掉所有 mirror 配置,强制走 central --> </mirrors> <profiles> <profile> <id>central-only</id> <repositories> <repository> <id>central</id> <url>https://repo.maven.apache.org/maven2</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>central-only</activeProfile> </activeProfiles> </settings> EOF

然后设置环境变量:

export MAVEN_HOME=/opt/maven387 export PATH=$MAVEN_HOME/bin:$PATH mvn -v # ✅ 正确输出应为: # Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946181e3090e9ed77fd) # Maven home: /opt/maven387 # Java version: 11.0.22, vendor: Eclipse Adoptium, runtime: /opt/java11

参数说明:

  • settings.xml中<mirrors>块完全留空,是绕过镜像污染的最简方案;
  • <activeProfiles>显式激活central-only,确保任何子项目都不会意外继承公司私有镜像;
  • localRepository路径用$(whoami)动态生成,避免多用户环境冲突。

2.3 验证组合有效性:用 Drools 自带的 quickstart 测试闭环

光看java -version和mvn -v成功还不够。我们必须用 Drools 官方提供的最小验证单元——drools-distribution-7.48.0.Final/examples/quickstarts/hello-world——跑通一次完整生命周期:

# 解压 drools-distribution-7.48.0.Final.zip 到 /opt/drools-748 unzip drools-distribution-7.48.0.Final.zip -d /opt/ cd /opt/drools-748/examples/quickstarts/hello-world # 清理旧构建、强制用指定 Maven & Java export JAVA_HOME=/opt/java11 export MAVEN_HOME=/opt/maven387 $MAVEN_HOME/bin/mvn clean compile exec:java

预期输出末尾应包含:

INFO Hello World INFO Goodbye

若出现Could not resolve dependencies for project org.drools:hello-world:jar:7.48.0.Final,说明 Maven 仍试图从错误镜像拉包;若报Unsupported class file major version 61,说明JAVA_HOME指向了 JDK 17;若卡在Building KieBase...无响应,则可能是kie-api与kie-internal版本不匹配——这通常源于你手动修改过pom.xml里的<drools.version>,而 7.48.0.Final 要求所有 KIE 子模块版本严格统一为7.48.0.Final,不可降级或升级。

3. 解压即启动:KIE Server 7.48.0.Final 的容器化部署与 WAR 包定制

drools-distribution-7.48.0.Final.zip的核心价值不在示例代码,而在kie-server-7.48.0.Final-ee7.war这个企业级规则服务 WAR 包。它不是 Tomcat 插件,而是设计为部署在 WildFly 26.1.0.Final(EE8 兼容)上的原生应用。强行丢进 Tomcat 9/10 会因 CDI、JAX-RS 实现差异直接启动失败。

3.1 部署 WildFly 26.1.0.Final:必须用 EE7 Profile,禁用 Jakarta EE 9+ 命名空间

Drools 7.48.0.Final 的 KIE Server 仍基于 Java EE 7 规范(javax.*包),而 WildFly 27+ 默认启用 Jakarta EE 9(jakarta.*包)。因此必须锁定 WildFly 26.1.0.Final,并显式启用standalone-ee7.xml配置文件:

# 下载 WildFly 26.1.0.Final(注意不是 26.0.0 或 26.1.1) wget https://github.com/wildfly/wildfly/releases/download/26.1.0.Final/wildfly-26.1.0.Final.zip unzip wildfly-26.1.0.Final.zip -d /opt/ sudo ln -sf /opt/wildfly-26.1.0.Final /opt/wildfly26 # 复制 KIE Server WAR 到部署目录 cp /opt/drools-748/kie-server-distribution/kie-server-7.48.0.Final-ee7.war /opt/wildfly26/standalone/deployments/ # 启动时指定 EE7 profile /opt/wildfly26/bin/standalone.sh -c standalone-ee7.xml -b 0.0.0.0 -bmanagement 0.0.0.0

启动成功标志:日志末尾出现

WFLYSRV0010: Deployed "kie-server-7.48.0.Final-ee7.war" (runtime-name : "kie-server-7.48.0.Final-ee7.war") WFLYUT0021: Registered web context: '/kie-server' for server 'default-server'

此时访问http://localhost:8080/kie-server/services/rest/server/应返回 XML 格式的服务器状态(需 Basic Auth,用户名/密码默认为kieserver/kieserver1!)。

3.2 WAR 包瘦身:移除冗余模块,避免 ClassLoader 冲突

kie-server-7.48.0.Final-ee7.war默认包含全部可选功能(BRMS UI、OptaPlanner 集成、jBPM 流程引擎),但如果你只用规则执行服务(REST/Java Client 调用 DRL),这些模块不仅增大包体积(120MB+),还会在 WildFly 的模块类加载器中引发LinkageError。实测可安全移除:

路径说明移除后影响
WEB-INF/lib/kie-server-controller*-7.48.0.Final.jar控制台管理模块无法通过/controller访问 Web UI,但 REST API 不受影响
WEB-INF/lib/jbpm*-7.48.0.Final.jarjBPM 流程引擎依赖无法部署 BPMN 流程,纯 DRL 规则不受限
WEB-INF/lib/optaplanner*-7.48.0.Final.jarOptaPlanner 集成无法在规则中调用SolverManager,不影响KieSession.fireAllRules()

操作命令(在解压后的 WAR 目录内执行):

cd /tmp/kie-server-unpacked zip -d kie-server-7.48.0.Final-ee7.war \ 'WEB-INF/lib/kie-server-controller*-7.48.0.Final.jar' \ 'WEB-INF/lib/jbpm*-7.48.0.Final.jar' \ 'WEB-INF/lib/optaplanner*-7.48.0.Final.jar' # 重新压缩为标准 WAR zip -r /opt/wildfly26/standalone/deployments/kie-server-7.48.0.Final-ee7.war .

注意:zip -d删除后必须用zip -r重新归档,不能直接cp回部署目录,WildFly 会校验 WAR 的META-INF/MANIFEST.MF时间戳。

3.3 配置 KIE Server 数据源:连接 PostgreSQL 13+ 而非 H2

默认 KIE Server 使用嵌入式 H2 数据库存储容器(KieContainer)、扫描任务(Scanner)等元数据,但 H2 在生产环境无法支撑高并发规则查询。必须切换为 PostgreSQL(13.10+ 或 14.7+):

  1. 将postgresql-42.5.4.jar放入/opt/wildfly26/modules/system/layers/base/org/postgresql/main/(创建对应目录结构);
  2. 编辑/opt/wildfly26/modules/system/layers/base/org/postgresql/main/module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.9" name="org.postgresql"> <resources> <resource-root path="postgresql-42.5.4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
  1. 修改/opt/wildfly26/standalone/configuration/standalone-ee7.xml,在<datasources>节点内添加:
<datasource jndi-name="java:jboss/datasources/KieServerDS" pool-name="KieServerDS" enabled="true" use-java-context="true"> <connection-url>jdbc:postgresql://localhost:5432/kieserver?currentSchema=public</connection-url> <driver>postgresql</driver> <security> <user-name>kieserver</user-name> <password>kieserver123</password> </security> </datasource>
  1. 在 PostgreSQL 中建库建用户:
CREATE DATABASE kieserver ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8'; CREATE USER kieserver WITH PASSWORD 'kieserver123'; GRANT ALL PRIVILEGES ON DATABASE kieserver TO kieserver; -- 执行 KIE Server 提供的 DDL(路径:/opt/drools-748/kie-server-distribution/sql-scripts/postgresql-kieserver-ds.sql) \c kieserver \i /opt/drools-748/kie-server-distribution/sql-scripts/postgresql-kieserver-ds.sql

重启 WildFly 后,日志中应出现KieServerDS初始化成功的提示,且http://localhost:8080/kie-server/services/rest/server/containers返回的 JSON 中status为SUCCESS。

4. 规则工程落地:DRL 文件编写、KieContainer 构建与热更新实战

KIE Server 的核心能力是让业务规则脱离代码编译周期。但drools-distribution-7.48.0.Final的规则热更新机制有隐性约束:DRL 文件必须放在src/main/resources下,且 KieContainer 的 GAV(GroupId:ArtifactId:Version)必须全局唯一,否则POST /containers/{id}会静默失败。

4.1 编写符合 7.48.0.Final 语法的 DRL:避开已废弃的 accumulate 函数

Drools 7.48.0.Final 中accumulate函数的语法已变更,旧写法accumulate($p : Person(), $sum : sum($p.age))会触发ParseException。新规范要求显式声明init,action,result块:

// ✅ 正确写法(src/main/resources/rules/credit-rules.drl) package com.example.credit import java.math.BigDecimal; dialect "java" rule "High Income Approval" when $app : Application( income > 50000 ) then $app.setApproved(true); $app.setLimit(new BigDecimal("100000")); end rule "Calculate Risk Score" when $app : Application() $score : Number(intValue > 0) from accumulate( $t : Transaction( amount > 1000 ), init( int total = 0; ), action( total += $t.amount.intValue(); ), result( new Integer(total) ) ) then $app.setRiskScore($score.intValue()); end

关键点:

  • dialect "java"必须显式声明,否则 lambda 表达式解析失败;
  • accumulate的init/action/result三段式不可省略,sum()等快捷函数已被移除;
  • Application类必须在kie-server的 classpath 中(即打包进 KJAR),不能是远程类加载。

4.2 构建 KJAR:用 kie-maven-plugin 7.48.0.Final 生成可部署包

KJAR(Kie JAR)不是普通 JAR,它必须包含META-INF/kmodule.xml和src/main/resources/下的 DRL。pom.xml必须严格遵循以下结构:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>credit-kjar</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>kjar</packaging> <!-- ⚠️ 必须是 kjar --> <properties> <drools.version>7.48.0.Final</drools.version> </properties> <dependencies> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>${drools.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.kie</groupId> <artifactId>kie-maven-plugin</artifactId> <version>${drools.version}</version> <extensions>true</extensions> </plugin> </plugins> </build> </project>

构建命令:

cd /path/to/credit-kjar mvn clean install -DskipTests # 生成 target/credit-kjar-1.0.0-SNAPSHOT.jar(即 KJAR)

注意:<packaging>kjar</packaging>是 kie-maven-plugin 识别构建目标的关键,写成jar会导致kmodule.xml不被处理,KIE Server 部署时提示No kbase found。

4.3 部署与热更新:用 REST API 创建容器并推送新规则

KJAR 构建完成后,通过 KIE Server REST API 部署为容器(Container):

# 创建容器(POST) curl -X POST "http://localhost:8080/kie-server/services/rest/server/containers/credit-v1" \ -H "Content-Type: application/json" \ -H "Authorization: Basic a2llc2VydmVyOmtpZXNlcnZlcjEh" \ -d '{ "container-id" : "credit-v1", "release-id" : { "group-id" : "com.example", "artifact-id" : "credit-kjar", "version" : "1.0.0-SNAPSHOT" }, "resolved-release-id" : { "group-id" : "com.example", "artifact-id" : "credit-kjar", "version" : "1.0.0-SNAPSHOT" } }' # 验证容器状态 curl -X GET "http://localhost:8080/kie-server/services/rest/server/containers/credit-v1" \ -H "Authorization: Basic a2llc2VydmVyOmtpZXNlcnZlcjEh" # ✅ 返回 "status":"SUCCESS" 且 "container-id":"credit-v1"

热更新流程(修改 DRL 后重新部署):

  1. 修改credit-kjar/src/main/resources/rules/credit-rules.drl;
  2. mvn clean install生成新版本 KJAR(如1.0.1-SNAPSHOT);
  3. 调用PUT /containers/credit-v1推送新 Release ID:
curl -X PUT "http://localhost:8080/kie-server/services/rest/server/containers/credit-v1" \ -H "Content-Type: application/json" \ -H "Authorization: Basic a2llc2VydmVyOmtpZXNlcnZlcjEh" \ -d '{ "release-id": { "group-id": "com.example", "artifact-id": "credit-kjar", "version": "1.0.1-SNAPSHOT" } }'

提示:KIE Server 会自动卸载旧 KieBase、加载新规则,无需重启 WildFly。但若 DRL 语法错误,API 返回400 Bad Request且日志中会打印具体解析失败位置(如line 15 column 22),这是比 IDE 报错更准的调试依据。

5. 避坑指南:Drools 7.48.0.Final 最常踩的 5 个深坑与血泪解法

Drools 7.48.0.Final 的文档和社区讨论常滞后于实际行为,很多“看似合理”的操作会导致服务静默失效。以下是我在某跨平台系统规则中心迁移中亲历的 5 个高频翻车点,每一条都附带现象、根因和可立即执行的解法。

5.1 现象:KIE Server 启动成功,但GET /server/containers返回空数组,且日志无报错

原因:WildFly 的standalone-ee7.xml中未启用org.kie.serversubsystem。Drools 7.48.0.Final 的 KIE Server WAR 依赖此 subsystem 提供的KieServerImpl服务,若 subsystem 缺失,WAR 会部署成功但无法注册容器。
解法:编辑/opt/wildfly26/standalone/configuration/standalone-ee7.xml,在<extensions>节点末尾添加:

<extension module="org.kie.server"/>

并在<profile>的<subsystem xmlns="urn:jboss:domain:ee:4.0">后插入:

<subsystem xmlns="urn:jboss:domain:kieserver:2.0"> <providers> <provider name="KieServer" class="org.kie.server.remote.rest.common.KieServerRestImpl"/> </providers> </subsystem>

重启 WildFly 后,日志中应出现KieServerSubsystemParser: Started KIE Server subsystem。

5.2 现象:POST /containers/{id}返回201 Created,但GET /containers/{id}/status显示UNINITIALIZED

原因:KJAR 的pom.xml中<version>使用了1.0.0-SNAPSHOT,而 KIE Server 默认禁用 SNAPSHOT 版本部署(出于生产安全考虑)。
解法:在 WildFly 启动参数中添加-Dorg.kie.server.allow.snapshot=true:

/opt/wildfly26/bin/standalone.sh -c standalone-ee7.xml -b 0.0.0.0 \ -Dorg.kie.server.allow.snapshot=true

或在standalone-ee7.xml的<system-properties>中添加:

<property name="org.kie.server.allow.snapshot" value="true"/>

5.3 现象:规则能加载,但fireAllRules()不触发任何 rule,且KieSession.getFactCount()返回 0

原因:DRL 文件中rule块未声明salience或no-loop true,而事实对象(Fact)在插入时被 KIE Server 的默认KieSession配置(StatelessKieSession)忽略。7.48.0.Final 默认创建的是StatelessKieSession,它不维护事实生命周期。
解法:在kmodule.xml中显式声明KieBase类型为stateful:

<kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="credit-kbase" packages="rules" default="true" eventProcessingMode="cloud"> <ksession name="credit-session" type="stateful" default="true"/> </kbase> </kmodule>

并确保 KJAR 的src/main/resources/META-INF/kmodule.xml被正确打包。

5.4 现象:调用POST /containers/{id}/execute执行规则时,返回500 Internal Server Error,日志报java.lang.NoClassDefFoundError: org/kie/api/runtime/RuleRuntime

原因:客户端请求体中json格式错误。KIE Server 7.48.0.Final 的 REST API 对commands数组的 JSON 结构极其敏感,若insert命令的object字段值不是合法 JSON 对象(如用了单引号、缺少逗号),会触发类加载器异常而非友好的 400 错误。
解法:严格按官方 schema 构造请求体。例如插入Application对象:

{ "lookup": "credit-session", "commands": [ { "insert": { "object": { "com.example.Application": { "income": 60000, "name": "Alice" } }, "out-identifier": "app" } }, { "fire-all-rules": {} } ] }

⚠️ 注意:"com.example.Application"是类全限定名,不是 JSON key;"out-identifier"必须与 DRL 中$app : Application()的变量名一致。

5.5 现象:WildFly 日志反复打印WARN [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (default task-1) Cannot find kjar

原因:KJAR 的groupId:artifactId:version与POST /containers请求体中的release-id不完全一致,包括大小写、连字符。Drools 7.48.0.Final 的 artifact resolution 是严格字符串匹配,credit-kjar≠CreditKjar。
解法:用mvn dependency:tree确认 KJAR 的真实坐标:

cd /path/to/kjar mvn help:effective-pom | grep -A5 "<artifactId>" # 输出必须与 API 请求体中的 group-id/artifact-id/version 完全一致

并在pom.xml中统一使用小写字母和短横线,避免驼峰命名。

6. 验证跑通:用 Java Client 调用 KIE Server 并断言规则逻辑正确性

装完环境、部署好容器、写好 DRL,最终要落到「规则是否真按业务预期执行」。我从不依赖 Postman 点击测试,而是写一个极简 Java Client,用kie-server-client7.48.0.Final SDK 直接调用,并用 JUnit 断言输出。这套验证流程我每次上线前必跑,它比任何日志检查都可靠。

6.1 编写验证 Client:复用 KIE Server 的 client jar,避免版本错配

drools-distribution-7.48.0.Final.zip的lib/目录下自带kie-server-client-7.48.0.Final.jar,它已预编译适配所有 REST 接口。我们直接将其加入 classpath,不从 Maven 中拉取(避免7.48.0.Final与7.48.0.Final-redhat-00001等变体冲突):

// VerifyKieServer.java import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.RuleServicesClient; import org.kie.server.client.model.ServiceResponse; import org.kie.server.client.model.instance.CommandResponse; import org.kie.server.client.model.instance.ExecuteResponse; import org.kie.server.client.model.instance.FactHandleInstance; import java.util.*; import static org.junit.jupiter.api.Assertions.*; public class VerifyKieServer { private static final String URL = "http://localhost:8080/kie-server/services/rest/server"; private static final String USER = "kieserver"; private static final String PASS = "kieserver1!"; public static void main(String[] args) { // 1. 构建 client(必须用 distribution 自带的 jar) KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(URL, USER, PASS); config.setMarshallingFormat(org.kie.server.api.marshalling.MarshallingFormat.JSON); KieServicesClient client = KieServicesFactory.newKieServicesClient(config); // 2. 获取 RuleServicesClient RuleServicesClient ruleClient = client.getServicesClient(RuleServicesClient.class); // 3. 构建 Application 事实对象(必须与 DRL 中 import 的类一致) Map<String, Object> app = new HashMap<>(); app.put("income", 55000); // 触发 High Income Approval 规则 app.put("name", "Bob"); // 4. 执行规则 ServiceResponse<ExecuteResponse> response = ruleClient.executeCommandsWithResults( "credit-v1", "[\n" + " {\n" + " \"insert\": {\n" + " \"object\": {\n" + " \"com.example.Application\": " + app + "\n" + " },\n" + " \"out-identifier\": \"app\"\n" + " }\n" + " },\n" + " {\n" + " \"fire-all-rules\": {}\n" + " }\n" + "]" ); // 5. 断言结果 assertTrue(response.getType() == ServiceResponse.ResponseType.SUCCESS, "KIE Server returned error: " + response.getMsg()); ExecuteResponse executeResponse = response.getResult(); List<CommandResponse> results = executeResponse.getResults(); // 查找名为 "app" 的插入结果 Optional<CommandResponse> appResult = results.stream() .filter(r -> "app".equals(r.getId())) .findFirst(); assertTrue(appResult.isPresent(), "Fact 'app' not found in response"); // 解析返回的 Application 对象 Map<String, Object> returnedApp = (Map<String, Object>) appResult.get().getResult(); Boolean approved = (Boolean) returnedApp.get("approved"); Object limit = returnedApp.get("limit"); assertTrue(approved, "Rule 'High Income Approval' did not fire"); assertNotNull(limit, "Limit field was not set by rule"); assertEquals("100000", limit.toString(), "Limit value mismatch <p> <a href="https://download.csdn.net/download/aqqabqqb/14928955" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>
返回列表