尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null
Posted
技术标签:
【中文标题】尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null【英文标题】:Trying to use Rhino, getEngineByName("JavaScript") returns null in OpenJDK 7 【发布时间】:2012-04-20 16:58:13 【问题描述】:当我运行以下代码时,当我使用 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
下。
【问题讨论】:
另见Javascript engine can not be found; JDK 提供者可以选择要打包的脚本引擎(如果有的话)。 有趣,jdk 7 在 debian 上对我有同样的问题。 jdk6的jrunsript运行javascript引擎,jdk 7 jrunsript打印“engine for language js cannot be found”。 注意:您不能确定给定的脚本引擎是否可用。如果您真的需要它,请自己携带。 Fixed in 7~u3-2.1.1~pre1-1ubuntu2 在 OSX 上有同样的问题,如果有人能回答 如何 提供我自己的服务,我会投赞成票。我试过只在类路径上放 rhino jar,但它不工作 【参考方案1】:[更新:这是一个错误,现在有 been fixed]
简而言之,这可能是一个错误。
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,但没有书面理由,所以我提交了bug #982501 in the Ubuntu OpenJDK 7 launchpad。收到后会给出更好的答案。
1 根据this thread,
我在某处听说 Mozilla 不接受 Suns 对他们的更改 主线分支,原因未知,但那是在开源之前。
还有一些由 JRE 版本和 BYOR(bring-you-own-Rhino)版本(例如 bug #255149 on Ubuntu OpenJDK 7 launchpad)冲突引起的冲突问题。但是,来源在 OpenJDK 7 中的 source 和 makefile 中提到的,和上面线程中提到的 BSD 端口具有相同的 sources。
2 根据这个 Sun bug #6876736,这是基于发行版的决定:
rhino 源不是 OpenJDK 的一部分,由发行版添加它。
与它们被签入 OpenJDK mercurial 的事实有所不同,但我认为这个想法是 Rhino 不在 JDK 规范中。
【讨论】:
在 7~u3-2.1.1~pre1-1ubuntu2 中修复【参考方案2】:你必须注册Rhino服务,但我不知道具体怎么做,是通过在META-INF里面创建一个文件
或者你可以跳过Script API直接使用。
检查这个基本示例:
https://github.com/mozilla/rhino/blob/master/examples/Control.java
【讨论】:
以上是关于尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null的主要内容,如果未能解决你的问题,请参考以下文章
使用 require.js 和 Java/Rhino 解析模块