gpt4 book ai didi

java - 如何让 Drools (Kie Session) 在 Netbeans Web 项目(无 Maven)中运行?

转载 作者:行者123 更新时间:2023-11-30 02:51:59 25 4
gpt4 key购买 nike

这几天我一直在尝试在 Netbeans 中运行 Drools,但它并没有像我想要的那样工作。我什至尝试让它作为一个 Maven 项目工作,但效果不佳。我描述了我是如何创建该项目的,希望有人能给我提示。

首先,我需要它在没有 Maven 的情况下工作,因为我被限制不能使用它。但在将它放入实际项目之前,我想测试它。

所以首先我创建一个新项目

  1. 文件>新建项目..向导
  2. 选择“Java Web”类别并使用项目类型“Webapplication”
  3. 选择 tomcat 8 Web 服务器和 Java EE 7 Web
  4. 目前没有框架(稍后 hibernate )
  5. 在项目中创建 lib 文件夹并将以下 jar 放入其中:

    • drools-compiler-6.4.0.Final.jar
    • drools-core-6.4.0.Final.jar
    • drools-decisiontables-6.4.0.Final.jar
    • drools-jsr94-6.4.0.Final.jar
    • drools-reteoo-6.4.0.Final.jar
    • knowledge-api-6.4.0.Final.jar
    • kie-api-6.4.0.Final.jar
    • kie-internal-6.4.0.Final.jar
    • kie-ci-6.4.0.Final.jar
    • mvel2-2.2.6.Final.jar
    • antlr-runtime-3.5.Final.jar

通过此设置,我创建了类(都在包中:Drools)DroolsMain(无需网络服务器和 GUI 进行测试,以加快调试速度)

public class DroolsMain {

private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
private static Collection<KnowledgePackage> pkgs;
private static KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
private static StatefulKnowledgeSession ksession;

public static void main(final String[] args) {
init();
initMessageObject();
fireRules();
}

private static void init() {
String myRule = "import Drools.Message rule \"Hello World 2\" when message:Message (type==\"Test\") then System.out.println(\"Test, Drools!\"); end";
Resource myResource = ResourceFactory.newReaderResource((Reader) new StringReader(myRule));
kbuilder.add(myResource, ResourceType.DRL);

if(kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
throw new RuntimeException("unable to compile dlr");
}

pkgs = kbuilder.getKnowledgePackages();

kbase.addKnowledgePackages(pkgs);

ksession = kbase.newStatefulKnowledgeSession();
}

private static void fireRules() {
ksession.fireAllRules();
}

private static void initMessageObject() {
Message msg = new Message();
msg.setType("Test");
ksession.insert(msg);
}
}

以及上面使用的Message

public class Message {
private String type;
private String message;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}


}

我现在可以运行该代码并返回消息。

现在我想和 Kie 一起尝试...

我只是注释了 DroolsMain main() 方法中的方法。并将 Kie 方法放入当前 Drools 文档 p 中。 172-174 那里:

private static void kieTest() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();

StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant bob = new Applicant("Mr. Bob", 16);
//assertTrue(bob.isValid());
kSession.execute(bob);
//assertFalse(bob.isValid());
}

我没有将 Applicant.class 放在这里,因为它只是一个具有 3 个属性的 bean。我还创建了 DRL applicant.drl 文件:

package Drools "Is of valid age"
import Drools.Applicant

when
$a : Applicant(age < 18)
then
$a.setValid(false);
end;

所以这显然不起作用,因为 Kie 有 Maven 依赖项,所以我尝试了这个: 1.添加目录: - DroolsTest/资源/ - DroolsTest/资源/META-INF - DroolsTest/资源/META-INF/maven - DroolsTest/资源/Drools 2.创建DroolsTest/resources/META-INFkmodule.xml

内容:

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="Drools" packages="Drools">
<ksession name="ksession-drools" />
</kbase>
</kmodule>
  • 创建 DroolsTest/resources/META-INF/maven/pom.properties内容:(groupId我的包名),(artifactId我的项目名)

    groupId=流口水工件Id=DroolsTest版本=1

  • 将 drl 文件放在这里:DroolsTest/resources/Drools/applicant.drl
  • 编译它会抛出一个 RuntimeException:

    Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieSession
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:555)
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:548)
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:531)
    at Drools.DroolsMain.kieTest(DroolsMain.java:43)
    at Drools.DroolsMain.main(DroolsMain.java:52)
    C:\Users\...\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 3 seconds)

    有没有办法让 Kiew 在没有 Maven 的情况下工作,或者我可以在没有它的情况下读取文件吗?

    <小时/>

    更新:

    我尝试了劳恩斯解决方案:

    import java.io.File;
    import org.kie.api.KieBase;
    import org.kie.api.KieServices;
    import org.kie.api.builder.KieBuilder;
    import org.kie.api.builder.KieFileSystem;
    import org.kie.api.builder.Results;
    import org.kie.api.io.Resource;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;

    public class DroolsMain {
    private void ntry() {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();

    File rule = new File("src/main/resources/Drools/applicant.drl");
    Resource res = kieServices.getResources().newFileSystemResource(rule);
    kfs.write(res);
    KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
    Results results = kieBuilder.getResults();

    System.out.println("---Messages---");
    System.out.println(results.getMessages());

    KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
    KieBase kieBase = kieContainer.getKieBase();
    KieSession kieSession = kieBase.newKieSession();
    }

    public static void main(final String[] args) {
    DroolsMain dm = new DroolsMain();
    dm.ntry();
    }
    }

    我还添加了 drools 发行版中的所有 jar。现在它可以编译并且没有错误

    最佳答案

    我就是这样做的,没有 Maven,没有 XML:

    public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    //...
    Resource res = ...;
    kfs.write( "src/main/resources/simple.drl", res );
    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
    System.out.println( results.getMessages() );
    throw new IllegalStateException( "### errors ###" );
    }

    KieContainer kieContainer =
    kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );

    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieBase.newKieSession();
    }

    我通常使用诸如

    之类的资源
    kieServices.getResources().newInputStreamResource( fis )

    因为从文件读取更加灵活。

    关于java - 如何让 Drools (Kie Session) 在 Netbeans Web 项目(无 Maven)中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38371941/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com