Drools报错:The Eclipse JDT Core jar is not in the classpath
这是由于drools-compiler.jar自带两套编译机制 默认使用的Eclipse JDT CORE
但是在某些环境下会报The Eclipse JDT Core jar is not in the classpath 比如weblogic环境下
解决方法是
将drools默认编译方式改为JANINO,
附上部分测试代码..
import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileReader; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.log4j.Logger; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderConfiguration; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.logger.KnowledgeRuntimeLogger; import org.drools.logger.KnowledgeRuntimeLoggerFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.springframework.stereotype.Service; /** * 调用规则引擎的内部serivce 接口实现 * @author wuxiaogang * */ @Service public class DroolsUtil{ private static final transient Logger log = Logger.getLogger(DroolsUtil.class); /** 本地缓存-已编译的事件规则 */ private static Map<String,KnowledgeBase> knowledgeBaseMap=new HashMap<String,KnowledgeBase>(); private static final Properties props = new Properties(); static{ props.put("drools.dialect.java.compiler","JANINO"); props.put("drools.dialect.default","java"); props.put("drools.compiler.lnglevel","1.7"); } public static void main(String[] args) throws Exception { DroolsUtil drl=new DroolsUtil(); //读取文件 BufferedReader br=new BufferedReader(new FileReader("d:/d4.drl" )); StringBuffer sb=new StringBuffer(""); String line=null; while((line=br.readLine())!=null){ sb.append( line +"\n"); } Map m=new HashMap(); m.put( "service", drl ); m.put( "obj", new Object() );//具体对象 m.put( "serviceHandler", false ); drl.touchDrlStr(sb.toString(),m);//以代码串形式加载 System.out.println("=============="+m.get( "serviceHandler" )); } /** * 验证生成的规则文件是否正确 * @return * @throws Exception */ private boolean isDrlYN(String drl_name){ try { // 创建规则构建器 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); // 加载规则文件,并增加到构建器 kbuilder.add(ResourceFactory.newClassPathResource("config/drools/"+drl_name+".drl"),ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); // 编译规则过程中发现规则是否有错误 if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { log.error(drl_name+".drl规则中存在错误,错误消息如下:"+error); } return false; } } catch (Exception e) { log.error(drl_name+".drl规则文件验证异常:",e); return false; } return true; } /** * 根据规则文件名称 加载编译规则文件. * @return * @throws Exception */ private static KnowledgeBase readKnowledgeBase(String drl_name) throws Exception { KnowledgeBuilderConfiguration kbConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props, (ClassLoader[]) null); // 创建规则构建器 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbConfig); // 加载规则文件,并增加到构建器 kbuilder.add(ResourceFactory.newClassPathResource("config/drools/"+drl_name+".drl"),ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); // 编译规则过程中发现规则是否有错误 if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.out.println("规则中存在错误,错误消息如下:"); System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } // 创建规则构建库 KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); // 构建器加载的资源文件包放入构建库 kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } public static boolean touchDrlFile(String drlFileName,Object ... objs) throws Exception { try { //--根据事件code加载规则-- KnowledgeBase kbase = knowledgeBaseMap.get(drlFileName); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "info"); if(objs!=null){ for(Object obj:objs){ ksession.insert(obj); } } ksession.fireAllRules(); logger.close(); } catch (Exception t) { t.printStackTrace(); } return false; } /** * 根据规则文件名称 加载编译规则文件. * @return * @throws Exception */ private static KnowledgeBase readKnowledgeBaseByStr(String drlcontext) throws Exception { KnowledgeBuilderConfiguration kbConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props, (ClassLoader[]) null); // 创建规则构建器 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbConfig); // 加载规则文件,并增加到构建器 kbuilder.add(ResourceFactory.newInputStreamResource(new ByteArrayInputStream( drlcontext.getBytes() )),ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); // 编译规则过程中发现规则是否有错误 if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.out.println("规则中存在错误,错误消息如下:"); System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } // 创建规则构建库 KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); // 构建器加载的资源文件包放入构建库 kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } public static void touchDrlStr(String drlContextStr, Object... objs) throws Exception { try { log.info("-- start run script---------"); log.info(drlContextStr); if(drlContextStr==null || drlContextStr.trim().length()==0){ return; } //--根据事件code加载规则-- KnowledgeBase kbase =readKnowledgeBaseByStr( drlContextStr ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "info"); if(objs!=null){ for(Object obj:objs){ ksession.insert(obj); } } ksession.fireAllRules(); logger.close(); log.info("-- end run script ----"); } catch (Exception t) { log.error(".............run script exception.......",t); } } }
附件中文件是代码文件和支持jar.