当我运行以下代码时,当我使用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
下。
[更新:这是一个错误,现在已经修复]
简而言之,这可能是一个bug。
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启动板中提交了一个bug#982501。一旦我得到答案,我会给出更好的答案。
1根据这个线程,
我在某个地方听说Mozilla不接受Suns将其更改为主线分支,原因未知,但那是在开源之前。
JRE和BYOR(自带Rhino)版本的冲突也导致了一些冲突问题(例如Ubuntu OpenJDK 7启动板上的错误#255149)。然而,源代码在OpenJDK7源代码中,并在makefile中提到,而在上面的线程中提到的BSD端口具有相同的源代码。
2根据这个Sun错误#6876736,这是基于发行版的决定:
rhino源代码不是OpenJDK的一部分,由发行版来添加它
这与它们被签入OpenJDK mercurial的事实形成了一定的对比,但我认为Rhino不在JDK规范中。
您必须通过在META-INF 中创建一个文件来注册Rhino服务,但我不知道具体如何注册
或者您可以跳过脚本API并直接使用它。
检查这个基本示例:
https://github.com/mozilla/rhino/blob/master/examples/Control.java