尝试使用Rhino,getEngineByName(“JavaScript”)在OpenJDK 7中返回null
当我运行下面的代码时,当我使用OpenJDK 7( java-7-openjdk-i386
)时, engine
变量被设置为null
。
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class TestRhino { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); try { System.out.println(engine.eval("1+1")); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
它与java-6-openjdk
和Oracle的jre1.7.0
运行良好。 知道为什么吗?
我正在使用Ubuntu 11.10。 所有JVM都安装在/usr/lib/jvm
。
[更新:这是一个错误,现已修复 ]
简而言之,这可能是一个错误。
Rhino支持类( com.sun.script.javascript.*
)没有编译成rt.jar
1 (尽管我发现这是Sun和Mozilla之间的合并问题,我知道存在名称空间问题,它们确实存在在OpenJDK 7源代码中并在makefile中引用,并且它们也缺少来自resources.jar
的META-INF/services
。 这不是OpenJDK 6的情况,它将此作为META-INF/services/javax.script.ScriptEngineFactory
条目:
#script engines supported com.sun.script.javascript.RhinoScriptEngineFactory #javascript
虽然这可能是一个发行版决定2没有书面理由,所以我在Ubuntu OpenJDK 7启动板中提交了一个错误#982501 。 一旦得到一个,我会给出更好的答案。
1根据这个post ,
我听说某个地方Mozilla没有接受太阳队改变他们的主线分支,原因不明但是在开源之前。
由于JRE版本和BYOR(自带自带的Rhino)版本之间存在冲突问题(例如Ubuntu OpenJDK 7启动板上的错误#255149 )。 但是,源是在OpenJDK 7 源中并在makefile中提到,并且上面线程中提到的BSD端口具有相同的源 。
2根据这个Sun bug#6876736 ,这是基于发行版的决定:
犀牛来源不是OpenJDK的一部分,它可以通过发行版来添加它。
与他们签入OpenJDK mercurial的事实相反,但我认为这个想法是Rhino不在JDK规范中。
您必须注册Rhino服务,但我不确切知道如何通过在META-INF中创建文件
或者您可以跳过脚本API并直接使用它。
检查这个基本示例:
https://github.com/mozilla/rhino/blob/master/examples/Control.java