当前位置: 首页 > 知识库问答 >
问题:

无法读取包上的Drools DRL文件

阙弘博
2023-03-14

我是drools的新手,我无法访问包中的DRL文件。我也是这么想的。我的项目规则的层次结构是这样的

我尝试使用以下代码访问DRL文件:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newClassPathResource( "neu/als/KnowledgeLevel", getClass() ), ResourceType.DRL );
        KnowledgeBuilderErrors errors = kbuilder.getErrors();

        if( errors.size() > 0 )
        {
            for( KnowledgeBuilderError error : errors )
            {
                System.err.println( error );
            }
            throw new IllegalArgumentException( "Could not parse knowledge." );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
        return kbase;

导致错误:

java.lang.RuntimeException: Unable to get LastModified for ClasspathResource
    at org.drools.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:204)
    at org.drools.io.impl.ClassPathResource.getInputStream(ClassPathResource.java:141)
    at org.drools.compiler.DrlParser.parse(DrlParser.java:145)
    at org.drools.compiler.DrlParser.parse(DrlParser.java:139)
    at org.drools.compiler.PackageBuilder.drlToPackageDescr(PackageBuilder.java:477)
    at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:466)
    at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:694)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:40)
    at com.neu.als.thesis.units.InferenceEngine.readKnowledgeBase(InferenceEngine.java:52)
    at com.neu.als.thesis.web.controllers.FLTController.evaluateFLT(FLTController.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:946)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:848)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:822)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: 'neu/als/KnowledgeLevel.drl' cannot be opened because it does not exist
    at org.drools.io.impl.ClassPathResource.getURL(ClassPathResource.java:165)
    at org.drools.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:177)
    ... 40 more
<servlet>
      <servlet-name>ThesisProject</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>ThesisProject</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/ThesisProject-servlet.xml</param-value>
  </context-param>

  <listener>
     <listener-class>
        org.springframework.web.context.ContextLoaderListener
     </listener-class>
  </listener>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  <context:component-scan base-package="com.neu.als.thesis.web.controllers" />

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/" />
    <property name="suffix" value=".jsp" />
  </bean>

</beans>

共有1个答案

孔俊捷
2023-03-14

您的知识库是使用“neu/als/knowledgeLevel”作为类路径构建的,而根据您的目录结构,正确的路径应该是“com/neu/als/knowledgeLevel”。

我不希望src/main/rules出现在项目类路径上,这也会对此产生影响。

我通常将规则保存在src/main/resources下,以便Maven将它们构建到类路径中。

 类似资料:
  • 环境:Ubuntu 18Spring开机2.0 JDK 11 当应用程序在IntelliJ中运行时,它会正确执行,但在Spring Bootmaven插件打包文件后读取文件时不会。 PS:该文件确实可以在打包的jar文件中找到!

  • 问题内容: 我想读取.bak文件,这些文件是ms sql数据库的备份文件。现在,我正在研究如何使用Sql Mngmnt studio读取这些文件。请帮帮我。谢谢 问题答案: 您可以使用SQL Management Studio将.BAK文件还原到临时数据库并读取它们! 这里的一些指针

  • 我正在尝试使用clojure创建一个简单的android应用程序,它可以读取csv文件,并允许用户对数据进行类似正则表达式的搜索。问题是,当我尝试读取数据时,会出现以下异常。 我的研究表明,这通常意味着Clojure正在寻找某样东西,但找不到。但是我不知道它可能是什么或者为什么。 下面是引发异常的Clojure代码: 据我所知,“kamus.csv”在正确的目录中,所以我不认为是这样。如果我在re

  • 问题内容: 我一周前开始使用Java,现在我想在窗口中插入一个图像。无论我尝试什么,我都会在Eclipse中继续使用它: javax.imageio.IIOException:无法读取输入文件! } 我认为代码很容易解释。我试图解决这个问题 我想做的是一个桌面程序,我的源代码存储如下:training / src / graphics / Window training / src / src /

  • 问题内容: 我在做一些真正愚蠢的事情时遇到了一个大问题。也就是说,打开流到我的META-INF文件夹中的资源文件。我正在使用jar工具并执行以下操作: 我只是一个空!该项目是使用maven构建的,xsd文件最终位于META-INF文件夹中,但仍然无法使用。 我不理解的是背后的理论?ClassLoader如何在文件系统中执行查找?如何获得文件? 问题答案: 尝试删除第一个斜杠: 如果要在对象上调用方

  • 问题内容: package main &{0xc42000a240}无 0无 没有错误,也没有数据。 从系统头文件读取此路径。 系统:macOS el capiton,go版本go1.8 darwin / amd64 我的最终目标是将此文件读入结构体中。此文件包含系统用户信息。 我可以这样做吗? 我会继续尝试… 问题答案: 您可以为此使用函数: 原始代码中的问题是读到的 长度为0个字节。由于阅读器