尝试使用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.jarMETA-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