我正在使用 Drools 6.6.0。这些是我的 pom.xml 文件中的 drools 支持的依赖项。
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.1.8.Final</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-runtime</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>core</artifactId>
<version>3.4.2.v_883_R34x</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>knowledge-api</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-jsr94</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.5.16</version>
</dependency>
我正在传递给 drools 对象,并且为了验证它我必须访问子类属性。根据 JBoss 教程,我应该能够通过这种方式将基础对象转换为子类型:
Person( name=="mark", address#LongAddress.( country == "uk" ) )
Person( name=="mark", address#LongAddress.country == "uk" )
Person( name=="mark", address isa LongAddress, address.country == "uk" )
但是我的drl文件不识别操作符#作为强制转换操作符(其实drools认为我要写评论),并且is不被识别。
首先,我使用的是 drools 版本 5 和 PackageBuilder。我在 src/main/resources/META-INF 文件夹中找到了 drl 文件,并且能够读取文件。目前我正在使用 drools 版本 6 - 仍然无法在 drools 中投射对象,并且知识生成器在同一位置看不到 drl 文件。
这是我读取 drl 文件的代码:
private static String DRL_FILE = "/META-INF/validationrules.drl";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource(DRL_FILE), ResourceType.DRL);
if( kbuilder.hasErrors() )
{
System.out.println( kbuilder.getErrors() );
return;
}
Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.insert(message);
我是否使用了正确的 drools 依赖项,并且 drools 是否支持内部规则转换?我应该在哪里放置一个 drl 文件?作为 Java 环境,我使用的是 IntelliJ。