Drools 与 Spring 集成,在我的测试用例中加载 DRL 文件时出现问题
Drools integration with Spring, issue loading DRL files in my test case
我正在尝试在 Maven Eclipse 项目中将 drools 与 Spring 一起使用。
1.My POM 具有以下内容
<properties>
<droolsVersion>5.5.0.Final</droolsVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${droolsVersion}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${droolsVersion}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.sample.app.Test2</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jboss</id>
<name>jboss</name>
<url><a href="https://repository.jboss.org/nexus/content/groups/public/</url>">https://repository.jboss.org/nexus/content/groups/public/</url></a>
</repository>
</repositories>
2.My 样本 class 在这里
package com.services.dms.model;
public class Account {
private Integer balance;
public Account() {}
public Integer getBalance() {
return balance;
}
public void setBalance(Integer balance) {
this.balance = balance;
}
public Account(Integer balance) {
super();
this.balance = balance;
}
public void withdraw(int money) {
balance -= money;
}
}
我的测试主class
package com.services.dms.service;
import org.drools.KnowledgeBase;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;
import com.services.dms.model.Account;
public class Test2 {
public static final void main(String[] args) {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("testrule.drl"), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
Account account = new Account(200);
account.withdraw(150);
ksession.execute(account);
}
}
而我的testrule.drl是
package com.services.dms.service
import com.services.model.account;
rule "accountBalanceAtLeast"
when
$account : Account( balance < 100 )
then
System.out.println("Warning! money running out!");
end
所以当我 运行 这个项目时,我得到一个文件未找到的异常,它无法找到 .drl 文件。
DRL 文件存储在 src->resources->rules
即使当我将规则文件与我的测试主文件放在同一个包中时 class 我也会得到同样的错误。
在其中收集的目录之一中需要类路径资源。 src/resources/rules
很可能不是类路径的一部分。我不知道你所说的 "put the file in the same package as my test main class" 是什么意思,但很可能你只是更改了 DRL 文件的包语句。
想想 JVM 如何找到 com.services.dms.model.Account:com.services.dms.model.Account 所在的目录必须是类路径的一部分。所以:将您的 DRL 文件放在那里并期望找到它。相反,在 Test2.main.
的文件名前加上一些目录级别的前缀
总是,总是,总是在添加资源后调用 KnowledgeBuilder 方法 hasErrors 和 getErrors,例如:
if( kbuilder.hasErrors() ){
System.err.println( "### compilation errors ###" );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
for( KnowledgeBuilderError err: errors ){
System.err.println( err.toString() );
}
throw new IllegalStateException( "compile errors" );
}
这将清楚地告诉您 DRL 文件中的问题所在。 (双重错误;-))
我正在尝试在 Maven Eclipse 项目中将 drools 与 Spring 一起使用。 1.My POM 具有以下内容
<properties>
<droolsVersion>5.5.0.Final</droolsVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${droolsVersion}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${droolsVersion}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.sample.app.Test2</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jboss</id>
<name>jboss</name>
<url><a href="https://repository.jboss.org/nexus/content/groups/public/</url>">https://repository.jboss.org/nexus/content/groups/public/</url></a>
</repository>
</repositories>
2.My 样本 class 在这里
package com.services.dms.model;
public class Account {
private Integer balance;
public Account() {}
public Integer getBalance() {
return balance;
}
public void setBalance(Integer balance) {
this.balance = balance;
}
public Account(Integer balance) {
super();
this.balance = balance;
}
public void withdraw(int money) {
balance -= money;
}
}
我的测试主class
package com.services.dms.service; import org.drools.KnowledgeBase; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.runtime.StatelessKnowledgeSession; import com.services.dms.model.Account; public class Test2 { public static final void main(String[] args) { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("testrule.drl"), ResourceType.DRL); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession(); Account account = new Account(200); account.withdraw(150); ksession.execute(account); } }
而我的testrule.drl是
package com.services.dms.service import com.services.model.account; rule "accountBalanceAtLeast" when $account : Account( balance < 100 ) then System.out.println("Warning! money running out!"); end
所以当我 运行 这个项目时,我得到一个文件未找到的异常,它无法找到 .drl 文件。
DRL 文件存储在 src->resources->rules
即使当我将规则文件与我的测试主文件放在同一个包中时 class 我也会得到同样的错误。
在其中收集的目录之一中需要类路径资源。 src/resources/rules
很可能不是类路径的一部分。我不知道你所说的 "put the file in the same package as my test main class" 是什么意思,但很可能你只是更改了 DRL 文件的包语句。
想想 JVM 如何找到 com.services.dms.model.Account:com.services.dms.model.Account 所在的目录必须是类路径的一部分。所以:将您的 DRL 文件放在那里并期望找到它。相反,在 Test2.main.
的文件名前加上一些目录级别的前缀总是,总是,总是在添加资源后调用 KnowledgeBuilder 方法 hasErrors 和 getErrors,例如:
if( kbuilder.hasErrors() ){
System.err.println( "### compilation errors ###" );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
for( KnowledgeBuilderError err: errors ){
System.err.println( err.toString() );
}
throw new IllegalStateException( "compile errors" );
}
这将清楚地告诉您 DRL 文件中的问题所在。 (双重错误;-))