最新的Java主版本(JavaSE
又称Mustang)现在正处于beta版本阶段
虽然该版本并不像Java
的更新那么多
但是它确实有一些有趣的新特性
毋庸置疑
其中的一个就是对脚本编写语言的支持
诸如PHPRubyJavaScriptPython(或Jython)之类的脚本编写语言被广泛应用于许多领域并由于其灵活性和简单性而大受欢迎由于脚本是被解释而不是被编译的所以可以轻松地从命令行运行和测试它们这就压缩了编码/测试周期并提高了开发人员的生产率脚本通常是动态键入的其语法极富表现力所编写出的算法要比Java中的等效算法简明得多使用起来通常也很有趣
在很多情况下从Java使用脚本编写语言会很有用比如为Java应用程序提供扩展以便用户可以编写自己的脚本进行扩展或定制化核心功能脚本编写语言可读性更强也更容易编写所以(从技术上来说)它们是用于为终端用户提供根据需求定制化产品的可能性的理想语言
早已经有许多Java可用的独立脚本编写包了包括RhinoJaclJythonBeanShellJRuby等新消息是Java通过一个标准接口为脚本编写语言提供了内置支持
Java提供对JSR规范的全面支持该规范提供了一种从Java内部执行脚本编写语言的方便标准的方式并提供从脚本内部访问Java资源和类的功能Java附带了与MozillaRhino的JavaScript实现的内置集成基于该规范对诸如PHPGroovy和BeanShell之类的其它脚本编写语言的支持也正在进行中本文关注的是Rhino实现但是其它语言应该是基本相同的
那么如何在Java中使用JSR的实现呢?偶经过仔细地研究终于找到了解决方法
干活要从理论开始
根据JavaDoc的说法javaxscriptScriptEngineManager是通过JAR规范中所谓的服务提供商(ServiceProvider)方法来在库中检索javaxscriptScriptEngineFactory实现类并自动注册的OK了解了这个就好办了准备开始干活哈
开始动手干活了:)
首先制作JSR规范实现的包(包括SUN的JavaScript默认实现):
使用WinRAR等压缩工具打开JRE中rtjar文件(注意要提前备份!我的就是备份为jsrjar)如图所示:
图rtjar的目录结构
OK下面开始删除文件除了comsunscriptjavaxscriptMETAINF目录之外其余的目录全都删除删除后如下图所示
图删除后的目录结构
目录做好之后下面开始按照JAR规范所描述的ServiceProvider方法来创建文件以便于javaxscriptScriptEngineManager的检索
在METAINF目录下建立一个名称为services的目录
在services目录中新建名称为javaxscriptScriptEngineFactory的空文件
在javaxscriptScriptEngineFactory文件中写入comsunscriptjavascriptRhinoScriptEngineFactory数据注意不写引号
图新加入的services目录和文件
最后将所有改动保存到jsrjar文件中工作完成!
测试包
将jsrjar加入到项目的库中然后编写下面的代码
ScriptEngineManagermanager=newScriptEngineManager();
ScriptEngineengine=managergetEngineByName(js);
engineput(age);
engineeval(if(age>=){+
print(Oldenoughtovote!);+
}else{+
print(Backtoschool!);+
});
这时控制台应返回Oldenoughtovote!下面是其在Eclipse下运行的截图
图测试程序在Eclipse下的运行情况
参考资料
JSR(ScriptingfortheJavaPlatform)规范
Mustang与RhinoJava中的脚本编写
JAR规范中的ServiceProvider描述#Service%Provider
本文的技术支持中国Eclipse社区()
jsrjar包下载jar