找不到 KieModule:org.default:artifact:1.0.0-SNAPSHOT

Posted

技术标签:

【中文标题】找不到 KieModule:org.default:artifact:1.0.0-SNAPSHOT【英文标题】:Cannot find KieModule: org.default:artifact:1.0.0-SNAPSHOT 【发布时间】:2018-01-19 20:26:45 【问题描述】:

我在 Spring Boot 应用程序中使用以下 drools 配置文件从在本地运行良好的数据库加载/执行规则,但是当我尝试将应用程序部署到服务器时,我收到一个错误,提示找不到 KieModule Bean。我将丢失的 KieModule Bean 添加到我的配置文件中,现在我收到另一个错误Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.RuntimeException: Cannot find KieModule: org.default:artifact:1.0.0-SNAPSHOT。我的问题是 1)为什么我需要这个 Bean 和 2)为什么应用程序在没有丢失 Bean 的情况下在本地构建/运行?

如果它是部署应用程序所需的强制 Bean,我是否需要通过向我的应用程序/POM 添加一些属性来专门为我的环境配置它??

public class DroolsDataBaseConfig 

    @Autowired 
    private DataService dataService;

    @PostConstruct
    public void loadResourcesFromDatabase()        

        try 
            KieHelper helper = getKieHelper();       
            List<Rule> rulesFromDB = dataService.findAllRules();

            for (Rule rule : rulesFromDB)

                String ruleAsStr = rule.getRule();

                helper.addContent(ruleAsStr, ResourceType.DRL);             
            

            helper.build(getKieServices().newKieBaseConfiguration());

         catch (Exception ex) 
            log.error("Exception occured loading rules from Database. Exception is : " + ex);           
        
     

     @Bean
     @ConditionalOnMissingBean(KieContainer.class)
     public KieContainer kieContainer() throws IOException 

         final KieRepository kieRepository = getKieServices().getRepository();       

         return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());      
     

     @Bean
     @ConditionalOnMissingBean(StatelessKieSession.class)
     public StatelessKieSession statelessKieSession() throws IOException   
         return kieContainer().newStatelessKieSession();
     

     private KieServices getKieServices() 
        return KieServices.Factory.get();
     

     @Bean
     @ConditionalOnMissingBean(KieHelper.class)
     public KieHelper getKieHelper() throws IOException 
         return new KieHelper();
     

     @Bean
     @ConditionalOnMissingBean(KieModule.class)
     public KieModule kieModule() throws IOException 
         return new KieModule() 
                public ReleaseId getReleaseId() 
                    return getKieServices().getRepository().getDefaultReleaseId();
                
         ;
     

     @Bean
     @ConditionalOnMissingBean(KieBase.class)
     public KieBase kieBase() throws IOException 
         return kieContainer().getKieBase();
     

【问题讨论】:

对于以后遇到这个问题的人来说,这个错误非常具有误导性!原来是我在数据库中的一条规则无法编译的问题。一旦我删除了有问题的规则,应用程序就可以正常启动了。 同样的例外,但正如你所说,问题出在我的规则操作部分 【参考方案1】:

正如 cmets 中所暗示的,这是 Drools 编译问题! 在日志中,我得到:

KieProject - Unable to build KieBaseModel:defaultKieBase
[3,14]: [ERR 107] Line 3:14 mismatched input 'java' expecting one of the following tokens: '[package, unit, import, global, declare, function, rule, query]'.

此消息不会将您定向到确切的错误,而是一般区域。我检查了导入部分,我已经将导入放在一个单元格中,然后在要导入的包列表中,我再次输入了“import”关键字。我更正它以匹配在线示例,并且电子表格编译!

【讨论】:

【参考方案2】:

KModule 已在应用程序上部署并启动,应用程序启动时需要它。

应用程序服务和 Wildfly(business-central) 都应该访问部署 KieModule 的同一个存储库。如果它们在不同的机器上运行,您可以创建一个远程存储库或由不同用户在同一台​​机器上运行它们的服务,那么您应该在 kie-server 服务所有者的 .m2 目录中创建一个 setting.xml 文件。

您应该在 setting.xml 文件中定义需求本地和远程存储库。

【讨论】:

【参考方案3】:

可以通过API注册模块(替代):

     //1: Declare: KieService and KieFileSystem ('kie', 'fileSystem')
     //2: Write: in Kie Filesystem: rules (.drl files)
     
     //Then: 
     //3: Declare: Kie Module (with project's pom.xml 'groupId:artifactId', as of: 'com.mycompany.x.y.z')

     final var module = kie.newKieModuleModel();
     module.newKieBaseModel().addPackage("com.mycompany.x.y.z");

     fileSystem.writeKModuleXML(module.toXML());

      //4: Declare: Kie Repository with releaseId
      //5: Return: KieContainer (with releaseId, [classLoader])  //e.g Thread.currentThread().getContextClassLoader()

【讨论】:

以上是关于找不到 KieModule:org.default:artifact:1.0.0-SNAPSHOT的主要内容,如果未能解决你的问题,请参考以下文章

java为啥每次都是找不到文件。找不到文件?

java 枚举 找不到符号

bat系统找不到指定文件怎么办?

java package找不到符号

SpringBoot报找不到 dao 问题

ubuntu20.04找不到start命令