【问题标题】:How can I start coding with Oracle's Nashorn JS Engine and when will it replace Rhino in the OpenJDK?如何开始使用 Oracle 的 Nashorn JS 引擎进行编码,它何时会取代 OpenJDK 中的 Rhino?
【发布时间】:2012-11-05 20:09:12
【问题描述】:

我正在寻找一种方法来开始使用 Oracle 的新 Nashorn JavaScript 引擎。我已经对最新的 OpenJDK 8 (b65) 进行了深度学习,看来 Rhino 仍然是唯一包含的脚本引擎。

有人知道 Nashorn 何时(或在哪个版本中)将取代 OpenJDK 中的 Rhino?或者更好的是,我在哪里可以获得已经包含它的 JDK?我知道 Netbeans 已经编写了一个调试器来使用它,只是不确定他们从哪里得到库/代码来开始编写它。

谁有链接?

谢谢。

【问题讨论】:

  • 根据路线图,它将在 2013 年末在 JDK 8 中引入,有关详细信息,请参阅 oracle.com/us/corporate/press/1854982
  • 感谢您发布链接。我知道它会出现在 JDK 8 中,我只是认为它会在发布日期之前很久就出现在 OpenJDK 中。
  • 似乎从 Java 11 开始,他们想要弃用 Nashhorn。见openjdk.java.net/jeps/335

标签: java rhino openjdk nashorn


【解决方案1】:

OpenJDK 上似乎还没有 Nashorn 的迹象。

Jim Laskey 在 2012 年 10 月的最新评论表明 2012 年第四季度:

https://blogs.oracle.com/nashorn/entry/welcome_to_the_nashorn_blog#comment-1351205506968

我认为是时候在 SO 上添加 标签了!

2012 年 12 月 1 日更新:

看起来像 2012 年 12 月下旬 OpenJDK 可能有它https://blogs.oracle.com/nashorn/entry/request_for_project_nashorn_open

2013 年 3 月 10 日更新:

@Seth 是正确的,1.7 release 3 PRERELEASE 不是 Nashorn。我的错!

JDK 8 b68 包含一个尚未合并的nashorn~jdk8 分支。

这个分支的自述文件说:

Nashorn 存储库正在迁移到 OpenJDK,因此 在几个方面不完整。 构建系统未完全集成。完成后,Nashorn 将 安装在 JRE 中的适当位置。 集成后,正确版本的 JDK 将被环绕 纳肖恩。同时,请确保您使用的是 JDK8 b68 或更高版本。

如果您从源代码签出 nashorn~jdk8,您可以构建 nashorn.jar

cd nashorn~jdk8/nashorn/make
ant clean; ant

您可以在最近的 jdk 1.8 版本中从 javax.script.ScriptEngineManager 请求“nashorn”引擎:

jrunscript -cp ./nashorn.jar -l "nashorn" -e "println(engine.factory.getParameter(
    javax.script.ScriptEngine.ENGINE))"
> Oracle Nashorn

或在路径中使用 nashorn.jar

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

2014 年 3 月 19 日更新:

来自@ncasas 的更新; JDK 8 is out 和 Nashorn 是默认的 JS 引擎。

【讨论】:

  • 嘿,谢谢。我没有看到那个评论。看起来我们只需要等待……至少它就在拐角处……我对丢失的 nashorn 标签也有同样的想法。 :)
  • “1.7 release 3 PRERELEASE”是 Rhino,不是 Nashorn。
  • @Seth。你说的对。 1.7 不是 nashorn。我的错误是将它与JDK6进行比较。更新了答案。
  • 在哪里可以找到 Nashorn 的良好 API 参考?很像developer.mozilla.org/en-US/docs/Web/JavaScript/Reference。 DOM API 是唯一从 Nashorn 的 ECMAScript5.1 实现中排除的东西吗?
【解决方案2】:

安装 JDK8 并为你的 JDK 的 jjs(Nashorn 解释器)创建一个别名,例如,如果你创建一个名为 test.js 的文件,你可以运行程序:

$ jjs test.js

Mac OS = alias jjs='/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs'

Windows = 定义一个名为“JAVA8_HOME”的环境变量并指向您的 jdk8 文件夹,然后您可以通过运行以下命令来调用 jjs:

> “%JAVA8_HOME%\jre\bin\jjs” test.js

【讨论】:

  • 你也可以编辑你的PATH环境变量,并在最后添加%JAVA8_HOME%\jre\bin。不用担心,如果它已经有 %JAVA_HOME%,它会优先,所以 javac 命令会在那里执行。只有新命令会从 JAVA8_HOME 执行。
【解决方案3】:

我做了更多的挖掘工作,您可以通过使用位于此处的反向移植让 Nashorn 使用 JDK7:

https://bitbucket.org/ramonza/nashorn-backport

签出该存储库并尝试使用ant -f make/build.xml 构建它,如 BitBucket 页面所述

如果由于 dynalink 导致构建失败,请应用问题部分 here 中列出的补丁(我假设开发人员很快会将其修补到主存储库中)。

在构建它时,您应该在克隆存储库的 dist 文件夹中获得一个 nashorn.jar 文件。

现在您需要使用类似于以下的 VM 选项将此 jar 添加到您的引导类路径:

-Xbootclasspath/a:C:/nashorn-backport/dist/nashorn.jar

现在你应该可以使用 nashorn 了。为了确保这是我编写的一个快速测试程序,它将列出可用的引擎工厂:

import javax.script.*;

public class NashornTest {
    public static void main(String args[]) {
        ScriptEngineManager manager = new ScriptEngineManager();
        for (ScriptEngineFactory f : manager.getEngineFactories()) {
            printBasicInfo(f);
            System.out.println();
        }
    }

    public static void printBasicInfo(ScriptEngineFactory factory) {
        System.out.println("engine name=" + factory.getEngineName());
        System.out.println("engine version=" + factory.getEngineVersion());
        System.out.println("language name=" + factory.getLanguageName());
        System.out.println("extensions=" + factory.getExtensions());
        System.out.println("language version=" + factory.getLanguageVersion());
        System.out.println("names=" + factory.getNames());
        System.out.println("mime types=" + factory.getMimeTypes());
    }
}

在设置了 bootclasspath 的情况下运行它会列出 Rhino 和 Nashorn,没有它你只会看到 Rhino。

【讨论】:

  • 我最终使用相同的方法在 JDK 7 中玩耍,而不必构建整个 JDK 8。好建议!
  • 我还没有对它和 Rhino 进行任何基准比较,但它显示的错误消息通常与 Rhinos 不同,有助于阐明您可能错过的事情。与 Rhino 不同的是,当从 Java 对象中读取字符串时,它会将字符串转换为文字类型而不是对象类型。也就是说,typeof console.testingString 在控制台是一个带有名为 testingString 的公共字符串的 java 对象时返回字符串,而在 Rhino 中则返回对象。使用 Rhino 时,无需在 String(); 中封装对 Java 字符串的调用。
  • 另外值得注意的是,java.net 上的最新版本现在包含 nashorn jdk8.java.net/download.html。此反向移植有一些问题已在最新版本中得到解决,特别是与 RegEx 相关的问题。
【解决方案4】:

我最近一直在研究如何使用它,我目前认为开始使用它的唯一方法是从源代码构建 OpenJDK,因为它在 2 月 7 日之后的当前版本中还没有。

我认为它会出现在本周晚些时候(21/02/2013)发布的开发者预览版中。

来源:http://openjdk.java.net/projects/jdk8/

【讨论】:

  • 不幸的是,开发计划发生了变化,但是您应该仍然可以在 OpenJDK 中找到 Nashorn。
  • 伦敦 JUG 与 Oracle 一起在 3 月 24 日星期日(撰写本文时的这个星期日)here's a link 举办了一场 HackDay。希望其中的信息会在网上发布,因为他们正在解释如何在 OpenJDK8 上构建 Nashorn。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2014-04-05
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
相关资源
最近更新 更多