android - Drools 与 Android 的集成

标签 android jboss drools rule-engine

我正在尝试将 Drools 集成到我的一个应用程序中。由于缺乏在线可用的文档,我面临着很多问题。早些时候我一直在努力解决依赖问题,但后来我使用以下 gradle 命令解决了这个问题。

compile 'org.kie:kie-api:6.1.0.Final'
compile 'org.drools:drools-core:6.1.0.Final'
compile 'org.drools:drools-compiler:6.1.0.Final'
compile files('libs/drools-android-6.5.0.Final.jar')
compile files('libs/janino-3.0.7.jar')

现在的问题是加载写入实际规则的 drl 文件。因此,根据引用资料,我知道我们需要使用 凯服务为了这。所以我有一个 myrule.drl 存储中的文件并使用此服务我正在尝试加载规则文件,但在执行相同操作时出现错误。分享我的代码以便更好地理解。
  KieServices kieServices = KieServices.Factory.get();
            KieFileSystem kfs = kieServices.newKieFileSystem();

            // for each DRL file, referenced by a plain old path name:
            String fileName = "myrule.drl";
            FileInputStream fis = new FileInputStream( Environment.getExternalStorageDirectory()+"/Android/Data/"+fileName);
            kfs.write( "src/main/resources/myrule.drl",
                    kieServices.getResources().newInputStreamResource( fis ) );

            KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
            Results results = kieBuilder.getResults();
            if( results.hasMessages( Message.Level.ERROR ) ){
                System.out.println( results.getMessages() );
                throw new IllegalStateException( "### errors ###" );
            }

            KieContainer kieContainer =
                    kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );

这里我在实例化 时遇到异常KieBuilder 目的。异常(exception)情况如下 -
java.lang.RuntimeException: Unable to instantiate object for class 'org.drools.android.DexPackageClassLoader' with constructor public org.drools.android.DexPackageClassLoader(org.drools.core.rule.JavaDialectRuntimeData,java.lang.ClassLoader)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.core.util.ClassUtils.instantiateObject(ClassUtils.java:272)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.core.rule.JavaDialectRuntimeData.makeClassLoader(JavaDialectRuntimeData.java:618)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.core.rule.JavaDialectRuntimeData.onAdd(JavaDialectRuntimeData.java:243)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.rule.builder.dialect.java.JavaDialect.<init>(JavaDialect.java:187)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration.newDialect(JavaDialectConfiguration.java:91)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.buildDialectRegistry(KnowledgeBuilderConfigurationImpl.java:392)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.compiler.PackageRegistry.<init>(PackageRegistry.java:55)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.newPackage(KnowledgeBuilderImpl.java:1571)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.initPackageRegistry(KnowledgeBuilderImpl.java:1044)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.createPackageRegistry(KnowledgeBuilderImpl.java:1015)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.initPackageRegistries(CompositeKnowledgeBuilderImpl.java:297)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:116)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:105)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:244)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:64)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:230)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:198)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at com.example.admin23.droolstest.MainActivity.onCreate(MainActivity.java:128)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.Activity.performCreate(Activity.java:6876)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
06-05 09:57:25.059 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.ActivityThread.access$1100(ActivityThread.java:221)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.os.Looper.loop(Looper.java:158)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7224)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err: Caused by: java.lang.reflect.InvocationTargetException
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at java.lang.reflect.Constructor.newInstance(Native Method)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.core.util.ClassUtils.instantiateObject(ClassUtils.java:270)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     ... 29 more
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.android.MultiDexClassLoader.<init>(MultiDexClassLoader.java:70)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     at org.drools.android.DexPackageClassLoader.<init>(DexPackageClassLoader.java:44)
06-05 09:57:25.069 21955-21955/com.example.admin23.droolstest W/System.err:     ... 31 more

这里还有一件事。如果我将应用程序 gradle 中的依赖项从 6.5.0.final 更改为 6.1.0 final,那么我将收到以下异常。
: FATAL EXCEPTION: main                                                                                    Process: com.example.admin23.droolstest, PID: 30886
java.lang.NoSuchFieldError: No static field UTF8_CHARSET of type Ljava/nio/charset/Charset; in class Lorg/drools/core/util/IoUtils; or its superclasses (declaration of 'org.drools.core.util.IoUtils' appears in /data/app/com.example.admin23.droolstest-2/base.apk:classes2.dex)
                                                                                        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.getOrGeneratePomXml(KieBuilderImpl.java:495)
                                                                                        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildPomModel(KieBuilderImpl.java:464)
                                                                                        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.getPomModel(KieBuilderImpl.java:448)
                                                                                        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.init(KieBuilderImpl.java:134)
                                                                                        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:169)
                                                                                        at com.example.admin23.droolstest.MainActivity.onCreate(MainActivity.java:143)
                                                                                        at android.app.Activity.performCreate(Activity.java:6876)
                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                                                        at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                        at android.os.Looper.loop(Looper.java:158)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

谁能帮我解决这个问题,因为我不知道我能做些什么来解决这个问题。任何帮助都是不言而喻的。

提前致谢。

最佳答案

编译'org.kie:kie-api:6.1.0.Final'
编译'org.drools:drools-core:6.1.0.Final'
编译 'org.drools:drools-compiler:6.1.0.Final'
编译文件('libs/drools-android-6.5.0.Final.jar')
编译文件('libs/janino-3.0.7.jar')

请完全使用相同版本的 6.X。应用重启后检查它是否有效。

仍然无法正常工作,请使用以下代码:

import org.kie.api.*;
import org.kie.api.builder.*;
import org.kie.api.runtime.*;

KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem();
FileInputStream fis = new FileInputStream( CTES.RULES );
kfs.write( "src/main/resources/sale.drl",
            ks.getResources().newInputStreamResource( fis ) );
KieBuilder kieBuilder = ks.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
     System.out.println( results.getMessages() );
     throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
     ks.newKieContainer( ks.getRepository().getDefaultReleaseId() );

KieBaseConfiguration config = ks.newKieBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KieBase kieBase = kieContainer.newKieBase( config );
KieSession kieSession = kieBase.newKieSession();

希望能帮助到你。

问候,
梅胡尔·帕特尔

关于android - Drools 与 Android 的集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44253770/

相关文章:

java - 将 Android 屏幕一分为二

java - Maven 避免包含依赖项

java - 无法在 Eclipse 中创建 .dslr

java - 比较 drools 规则中 HashMap 中存在的两个相同对象值

java - 在 JBoss 7.1.1 中使用 EJB 3.1 调用 Struts 2 Action 时获得 Struts 报告

drools - 无法将项目从远程 git/stash 存储库导入到 Business-Central

java - 工具栏上移

java - 点击推送通知后新 Activity 未打开

android - 使用 3.0 SDK 在 FB 墙上发帖

java - JBoss Developer Studio 9.1.0 FUSE CXF 项目总是给出 maven 错误