在jdk6.0中已经引入了对脚本语言开发的支持,这已经不是什么新鲜事儿,在网上一搜一堆的介绍和使用方法。下面这篇博客对jdk6新特性介绍的很详细: http://blog.csdn.net/stevexk/archive/2008/03/26/2219158.aspx ,针对“
脚本语言支持”这一特性,在环境是jdk6的开发环境中非常好实现,但是有些项目必须jdk5的环境下开发,又要遵循jsr223标准,支持通用的脚本引擎调用,使目前的项目今后能平滑的移植到jdk6上,不是件容易的事。实际上jdk6中已经内嵌集成了Rhino的javascript脚本解析执行引擎,作为其自身的默认脚本引擎。
记录一下我的解决方式,网上的这篇文章给我了不小的启示《 Java 5.0中实现JSR-223的方法 》,分析了一下,在实际项目中直接使用从 jdk6 的 rt.jar 中提取的子jar包,其实并不太可取,可用性和可维护行太差。随后,开始费牛劲儿在网上找现成的三方厂商或是开源的jsr223支持,最终找到了这篇文章的介绍 http://www.ibm.com/developerworks/cn/java/j-javascripting1/#resources ,并在jsr223官方网站( http://jcp.org/en/jsr/detail?id=223 )下载到“ JSR-223: Scripting for the Java Platform ”的实现,此版本执行脚本可以正常运行,但是jsr223-1.0与jdk6中的jsr223实现有很大的差异,并不兼容jdk6,所以还是决定放弃使用,最后决定结合jsr223标准为项目搞出一个自维护的包,要实现在jdk5.0中对脚本语言开发支持方式同jdk6.0一样的话,需要分为三个部分
(1) 准备jsr223标准接口部分;
(2) 找到自己合适Rhino版本包,(jdk5中没有集成Rhino引擎,需要从其官方网站或从maven库中下载,我用的版本是js-1.7R2.jar);
(3) 对rhino引擎做jsr223标准的适配。
**********************
第 1 部分都比较好解决,开发过jbpm4的人可能会知道,在jbpm4有一个依赖livetribe-jsr223.jar,这是一个第三方对jsr223标准接口的最新实现,可以直接引用。
第 2 部分直接从Rhino的官网下载,或是maven索引库下载(这个非常方便,如果用maven做持续集成,可以直接在add dependency的对话框中输入rhino,然后选择自己适用的版本即可)。
第 3 部分则需要手工建java项目例如XXX-jsr223.jar,并整理com.sun.script.javascript 、com.sun.script.util下的所有类了,其实并不多,网上很多地方提供这两个包的所有类,下载下来,包路径不要改,与jdk6里面的结构一样,然后修改相关*.java中的import,
把“
import sun.org.mozilla.javascript.internal.*; ”
修改为“
import org.mozilla.javascript.*;”
在META-INF/services/ 下创建javax.script.ScriptEngineFactory文件,内容是
#list of ScriptEngineFactory's in this package
com.sun.script.javascript.RhinoScriptEngineFactory #javascript
今后如果要支持其它脚本语言也可以在这里增加,例如:
#list of ScriptEngineFactory's in this package
com.sun.script.javascript.RhinoScriptEngineFactory #javascript
com.sun.script.groovy.GroovyScriptEngineFactory #groovy
com.sun.script.php.PHPScriptEngineFactory #PHP stateless
然后,打成XXX-jsr223.jar就可以用了,在项目里需要引用如下jar包:
XXX-jsr223.jar、livetribe-jsr223.jar、js-1.7R2.jar
就可以使jdk5的项目支持javascript的边写和运行了。
再进一步,既然jsr223是标准,那如果要在项目中同时支持javascript和juel的脚本开发运行,怎么做?
很简单,把下面的包引入项目即可:
XXX-jsr223.jar、livetribe-jsr223.jar、js-1.7R2.jar、juel-api.jar、juel-imp.jar、juel-engine.jar
代码调用juel和javascript的执行方式与jdk6中的调用完全一样:
/* javascript脚本的运行方式*/
ScriptEngineManager factory = new ScriptEngineManage();
ScriptEngine engine = factory.getEngineByName("js");
engine.put("string1", "Hello, Scripting");
engine.eval("print(string1)");
/* juel表单式的运行方式 */
ScriptEngineManager factory = new ScriptEngineManage();
ScriptEngine engine = factory.getEngineByName("juel");
engine.put("string1", "Hello, Scripting");
engine.eval("the string value is #{string1} !");
以上方法在jdk5环境下是一个可选的解决方案。最后建议,如果开发项目不用考虑兼容jdk5的相关环境,建议最好直接在jdk6上开发,避免上述自己动手过程。
做好了一个完成的jsr223实现包发布上来。
imp-jsr223-1.0.0-SNAPSHOT.jar http://u.115.com/file/f53b5db3c1 提取码:f53b5db3c1
其它依赖包:
livetribe-jsr223.jar http://www.jar114.com/j/8016
js-1.7R2.jar http://jar.fyicenter.com/523_JavaScript_rhino-js.1.7.2.jar_Rhino_JavaScript_for_Java_1.html
juel-api.jar、juel-imp.jar、juel-engine.jar 这三个网上自行下载吧。