我们这里是将Drools单独作为一个Bundle,所有依赖的包都是放在Bundle的CLASSPATH下,其中标红的包就是。还有另一种方式就是将所有依赖的包都以Bundle的形式部署在Felix上,但是由于包之间依赖关系比较复杂,而且也和其他模块之间没有太多共用的jar包,因此我们采取了当前这种方式。
这里需要注意的是:
1)蓝色字体的package实际上是虚拟机自带的rt.jar包中的部分,按常理说不需要显式导入,但是在Felix上必须要这样做,或者是在MANIFEST.MF中用“DynamicImport-Package * "的方式,但是一般不赞成这样做。
2)我们只是使用了规则引擎最基本的部分规则、规则流,并不涉及规则的持久化和管理等部分。因此我们打的是一个很精致的Bundle。
以下是我整合时的MANIFEST.MF文件。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Drools_osgi
Bundle-SymbolicName: drools_osgi
Bundle-Version: 1.5.4.qualifier
Bundle-Activator: drools_osgi.Activator
Bundle-Vendor: zhaic
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: javax.security.auth,
javax.xml.parsers,
org.osgi.framework,
org.w3c.dom,
org.xml.sax,
org.xml.sax.ext,
org.xml.sax.helpers
Bundle-ClassPath: .,
lib/antlr-runtime-3.3.jar,
lib/drools-compiler-5.3.0.Final.jar,
lib/drools-core-5.3.0.Final.jar,
lib/jbpm-flow-5.1.2.Final.jar,
lib/jbpm-flow-builder-5.1.2.Final.jar,
lib/knowledge-api-5.3.0.Final.jar,
lib/mvel2-2.1.0.drools4.jar,
lib/xmlpull-1.1.3.1.jar,
lib/xstream-1.4.1.jar,
lib/log4j-1.2.15.jar,
lib/commons-logging-1.0.4.jar,
lib/ecj-3.5.1.jar
如果不导入ecj-3.5.1.jar这个包,就会报:The Eclipse JDT Core jar is not in the classpath这个错误。网上有人说需要加入Drools核心包就会解决这个问题,其实引起这个错误有很多原因。具体只需要查看源码就清楚了。