<properties>
<drools.version>6.3.0.Final</drools.version>
</properties>
<repositories>
<repository>
<id>guvnor-m2-repo</id>
<url>https://192.168.0.101:8080/kie-drools/maven2/</url>
</repository>
</repositories>
<dependencies>
<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${drools.version}</version></dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>${drools.version}</version></dependency>
<dependency><groupId>org.kie</groupId><artifactId>kie-ci</artifactId><version>${drools.version}</version></dependency> <!-- 關鍵:支持遠程 Maven 解析 -->
</dependencies>

包名必須與 Kie Workbench 專案 `package` 完全一致(如 `org.sky.drools.approvaldecision`),Fact 類字段、Getter/Setter 需與遠程 Data Object 定義一致,否則反序列化失敗。
public class RemotePaymentRulz {
public static void main(String[] args) throws Exception {
// 1. 遠程 KJAR 地址
String url = "https://192.168.0.101:8080/kie-drools/maven2/org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar";
// 2. 構建 KieServices、Repository
KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
// 3. 認證下載 KJAR
UrlResource urlResource = (UrlResource) ks.getResources().newUrlResource(url);
urlResource.setUsername("tomcat");
urlResource.setPassword("tomcat");
urlResource.setBasicAuthentication("enabled");
InputStream is = urlResource.getInputStream();
// 4. 註冊模塊到本地 Repository
KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));
// 5. 創建容器
KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
// 6. 獲取 Stateless 會話(kmodule.xml 中定義的 session 名)
StatelessKieSession kSession = kContainer.newStatelessKieSession("defaultStatelessKieSession");
// 7. 構建 Fact、執行規則
PaymentInfo payment = new PaymentInfo();
payment.setMoneyAmount(5001); // 觸發 "GM" 規則
kSession.execute(payment); // 一次性執行,自動 fireAllRules + dispose
// 8. 讀取規則修改後的結果
System.out.println("決策路徑: " + payment.getDecisionPath());
if ("M".equalsIgnoreCase(payment.getDecisionPath())) {
System.out.println("金額 ≤ 5000,經理審批");
} else {
System.out.println("金額 > 5000,總經理審批");
}
}
}
UrlResource + Basic Auth → 安全下載遠程 KJARKieRepository.addKieModule(InputStreamResource) → 將 KJAR 註冊到本地 Maven 存儲,解析 `kmodule.xml`、`pom.properties`KieContainer → 運行時容器,持有 `KieBase`(規則網絡)、`KieSession` 工廠StatelessKieSession.execute(Object... facts) → 內部封裝:`insert(facts) → fireAllRules() → dispose()`,無狀態、線程安全、適合高併發




| 現象 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException: Fact 類 | 本地包名/類名與遠程不一致 | 從 Workbench 導出 Data Object JAR 或手動對齊 |
| 401 Unauthorized | Kie Workbench 認證失敗 | 檢查 tomcat-users.xml 役割 `kie-server,rest-all,admin` |
| 規則不生效 | kmodule.xml session 名稱錯誤 / 規則文件未包含在 kmodule | 核對 `kmodule.xml` <kbase> <ksession name="..."/> |
| 內存洩漏 | Stateful Session 未 dispose / KieContainer 未釋放 | Stateless 無此問題;Stateful 必須 try-finally dispose |