JAVA 平台中适当的使用脚本对于一些问题的解决常常达到事半功倍的效果,且诸如groovy这样的脚本语言本身也能够提高java编码的生产力。
但如果我们在平台中使用了多类脚本处理,脚本的处理代码混杂在一起是不容易维护,应该使用统一的管理方式。
JAVA6前,使用apache commons的BSF(Bean Scripting Framework),BSF本身即是一个脚本框架,支持不同脚本引擎的注册和调用,其已经发布了2.X和3.X版本,2.X自身支持了javascript、Python等脚本的引擎的实现,也支持groovy、JRuby等语言的引擎注册和管理。但到了3.X版本仅是提供对JSR-223的标准实现,且已经不再兼容2.X版本的接口,其自身也不再包括其它的引擎实现。其更多的被使用在JAVA4、JAVA5版本上,因在JAVA6有更好的选择。
JAVA6后自带的Scripting API(javax.script) ,亦是JSR-223的标准实现,且提供了更好的脚本框架解决方案,更好地做到和JVM和脚本引擎的整合。
javax.script使用了动态发现机制,支持动态加载classpath中的脚本服务。javax.script制定了脚本服务发布规范——服务是一组接口和类,由服务提供者提供实现,并约定将服务相关配置到JAR文件的META-INF/services/javax.script.ScriptEngineFactory的文件中,例如JAVA6自带的javascript引擎(默认只提供了Rhino引擎):
- com.sun.script.javascript.RhinoScriptEngineFactory
主流JVM平台的脚本引擎也都支持该规范的实现,例如在groovy中会找到:
- org.codehaus.groovy.jsr223.GroovyScriptEngineFactory
JRuby类似的有:
- org.jruby.embed.jsr223.JRubyEngineFactory
javax.script.ScriptEngineManager在运行时加载时会遍历classpath中的jar文件,寻找javax.script.ScriptEngineFactory配置,动态将引擎工厂注册到JAVA脚本框架中。
那么如果要使用groovy脚本,只需将groovy的包引入到classpath,运行时即可使用Scripting API的引擎执行groovy脚本了:
- ScriptEngineManager sem = new ScriptEngineManager();
- ScriptEngine engine = sem.getEngineByName("groovy");
更多相关内容请参考: