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;
    }

}

  1. 我的测试主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);
    
        }
      }
    
  2. 而我的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 文件中的问题所在。 (双重错误;-))