public RulesEngine2(String rulesFile) throws RulesEngineException {
super();
try {
PackageBuilderConfiguration kcfg = new PackageBuilderConfiguration();
JavaDialectConfiguration javaConf = (JavaDialectConfiguration) kcfg
.getDialectConfiguration("java");
//不知道是干吗用的
javaConf.setCompiler(JavaDialectConfiguration.JANINO);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder(kcfg);
kbuilder.add(ResourceFactory.newFileResource(rulesFile),
ResourceType.DRL);
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(pkgs);
ksession = kbase.newStatefulKnowledgeSession();
} catch (Exception e) {
throw new RulesEngineException(
"Could not load/compile rules file: " + rulesFile, e);
}
}
二、 Janino 简介
引用:http://tech.techweb.com.cn/archiver/tid-190424.html
Janino 是一种内嵌的开源Java编译器。Janino并不是一种提供给开发人员编译程序的编译器,而是Java程序在运行时编译Java代码的编译器。
对使用过JSP的Java开发人员来说,Java源代码(通常内嵌于 JSP中)动态编译成类文件是很熟悉的技术。但却未必知晓此技术的复杂性。而造成它比较笨拙的原因在于需要安装JDK(非JRE)。由于JDK并非免费, 于是又出现了license的问题。此外,对于不同的平台,需进行不同的平台配置并部署相应的类文件。对简化版的程序也同样需要复杂的操作。
尽管存在以上的问题,一些开源内库如Jasper仍基于JDK,且能提供很好的程序执行功能。基于Java的构建工具Ant同样面临在编译Java代码时需克服过于复杂的问题。基于以上所述,动态编译Java代码通常被认为是没有办法的办法,且在实际应用中表现欠佳。
Janino 采用如下的方式来解决这些问题:
1. Janino如同普通的应用程序一样,运行在JVM上,而不是将编译的工作间接转交给javac(或是等同的Java编译器)来完成。同时也不需要额外的配置或安装JDK。
2. 由于Janino直接从JVM获得classes类文件,而不是通过应用程序获取class文件和.jar文件。这意味着无需考虑权限问题或是构建路径的配置。
3 Janino提供一种简单易用的方式来编译表达、脚本和classes类文件。开发人员无需关心加载动态生成代码的技术细节,因为Janino自动实现了它。在最简单的层面,传递一个包含Java代码的字符串即可返回一个对象。
Janino被更广范的应用于那些比较复杂、杂乱且与平台相关的Java应用程序的源码编译。Janino通过动态编译代码,从而提高了程序的性能。