问题标签 [nashorn]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2175 浏览

java - Nashorn ScriptEngine 使用多少内存?

我们目前正在为我们的一款产品添加服务器端脚本功能。作为其中的一部分,我正在评估 JSR 223 脚本引擎。由于我们可能会在服务器上运行大量脚本,因此我特别关心这些脚本引擎的内存使用情况。将 Rhino(Apple JDK 1.6.0_65-b14-462-11M4609,Mac OS X 10.9.2)与 Nashorn(Oracle JDK 1.8.0-b132)进行比较,每个 ScriptEngine 实例的内存使用量似乎存在巨大差异。

为了测试这一点,我使用了一个简单的程序来启动 10 个空白 ScriptEngine 实例,然后阻止从标准输入读取。然后我使用 jmap 进行堆转储(jmap -dump:format=b,file=heap.bin),然后在转储中搜索相关的脚本引擎实例:

取消上下文中各种读取器/写入器字段的原因是因为我们不使用它们,并且早期的 Rhino 堆转储表明它们构成了每个实例开销的很大一部分(并且似乎没有共享) .

在 Eclipse MAT 中分析这些堆转储,然后我得到以下每个实例保留的堆大小:

  • Rhino:13,472 字节/实例(如果我不将读取器/写入器字段清空,则上升到 73,832 字节/实例)
  • Nashorn:324,408 字节/实例

Nashorn 的规模会增加 24 倍吗?执行速度不是我们将要执行的脚本(主要是 I/O 绑定)的主要关注点,因此我正在考虑发布我们自己的 Rhino 副本以在 Java 8+ 中使用。

0 投票
1 回答
2425 浏览

java - 从 Nashorn 获取扩展的 Java 类

有没有办法从 JavaScript (Nashorn) 获取和使用扩展的 Java 类?

我想做的是在 Nashorn 中扩展一个 Java 类,然后将其传递回 Java。例如,我们在 JS 中定义一个扩展另一个类的类:

然后我尝试在 Java 中获取这个扩展对象,如下所示:Object mySomeClass = scriptEngine.get("MySomeClass");

但是,我无法在 Java 中对此对象进行任何方法调用。当我尝试将其强制转换为基类时,它总是会引发异常 - com.test.SomeClass

是否可以在 Java 中使用在 Nashorn (JS) 中创建的扩展类?

0 投票
1 回答
1446 浏览

java - 在评估脚本后读取更新的变量

我正在测试一些与 Rhino 一起使用的 JSR 223(脚本)代码,以了解它如何与 Nashorn 一起使用。一个不同的领域是处理通过Bindings参数传入的变量的更新engine.eval()。在 Rhino 中,我可以在评估脚本时使用此方法传入动态变量绑定,然后在执行脚本后读取这些变量的任何更新值。然而,在 Nashorn 中,这不起作用 - Bindings 对象中的所有变量的值在执行脚本后仍然以其初始值存在。

用一个 TestNG 测试用例来说明:

使用 Rhino(Mac OS X 10.9.3 上的 Apple JDK 1.6.0_65)测试通过。使用 Nashorn (Oracle JDK 1.8.0_b132) 它失败了。我尝试了各种不同的方法来读取变量之后 - 调用engine.get(),engine.getBindings(ScriptContext.ENGINE_SCOPE).get()engine.getContext().getBindings(...).get()。结果总是null.

如果我调用它然后用 之后读取它,我可以让它工作,但与仅将绑定作为参数传递相比,这似乎有点混乱。engine.put("state", 1)engine.get("state")

阅读 JSR-223 规范,我找不到任何支持这种用法的措辞,那么它是特定于引擎的吗?还有其他方法可以在 Nashorn 中完成我想要的吗?

编辑:一种可行的方法是将每个变量包装在 an 中AtomicReference,然后.set(..)在 Javascript 中调用显式方法。丑陋,但可能可行。

0 投票
1 回答
2191 浏览

java - 调用匿名 JavaScript 函数

我当前的 JavaScript 如下所示:

在 Java 端收到一个jdk.nashorn.internal.runtime.ScriptFunction女巫,我试图与之通话

但它抛出了这个:

我怎样才能调用这个函数?

0 投票
1 回答
2846 浏览

java - 如何为 jjs/Nashorn javascript 指定 CLASSPATH?

我想在我的 Nashorn javascript 中加载一个 3rd 方类,它作为一个可兴奋的 shell 脚本运行。我检查了下面的线程,但没有得到任何提示。

如何在 Nashorn 中的 javascript 中 访问我的类中的方法 如何在 Nashorn 中的 javascript 中访问我的类中的方法

这是我的脚本

运行时出现此错误

线程“主”java.lang.RuntimeException 中的异常:java.sql.SQLException:找不到适合 jdbc 的驱动程序:sqlserver://1.2.3.4:1433;databaseName=email;user=email;password=email; 在 jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:382) 在 jdk.nashorn.tools.Shell.apply(Shell.java:381) 在 jdk.nashorn.tools.Shell.runScripts(Shell.java :310) 在 jdk.nashorn.tools.Shell.run(Shell.java:166) 在 jdk.nashorn.tools.Shell.main(Shell.java:130) 在 jdk.nashorn.tools.Shell.main(Shell. java:109) 原因:java.sql.SQLException: 找不到适合 jdbc:sqlserver://12.3.4:1433;databaseName=email;user=email;password=email; 的驱动程序 在 java.sql.DriverManager.getConnection(DriverManager.java:689) 在 java.sql.DriverManager.getConnection(DriverManager.

0 投票
1 回答
2113 浏览

java - Java nashorn 比较 java 对象是否属于某种 java 类型

我正在使用 instanceof,但它目前没有像我预期的那样工作。我有一个从脚本中的 java 代码中检索到的变量。让我们将此变量称为 myObject,它是 MyObject 类的实例,正如您所期望的那样。

我只能在网上找到有关此的模糊信息。检查 myObject 是否是 MyObject 类的实例的明确方法是什么,就像我在 Java 中很容易做的那样?

谢谢!

0 投票
5 回答
4866 浏览

java - 如何从 Nashorn 引擎中删除 java api?

是否可以从 nashorn-engine 隐藏或删除 java api?所以它只能看到或使用带有一些特别暴露的函数/变量的“默认”ECMAScript 262 Edition 5.1?

我想让我的最终用户为他们自己创建一些特定的逻辑,而不用担心他们会破解整个系统。当然,在 nashorn 引擎等中可能存在一些安全漏洞,但这是不同的主题。

编辑:对不起,我忘了提到我在我的 java 应用程序中运行 nashorn,所以不能使用命令行参数。

0 投票
2 回答
3731 浏览

java - 在 WildFly 中找不到 Nashorn 类

我需要在 WildFly 中运行的 Web 应用程序中从 nashorn 访问一个内部类。

以下代码在我的机器上运行良好:

但是当我在 WildFly 中运行时,以下 servlet 会抛出 ClassNotFoundException:

这是服务器日志:https ://gist.github.com/csokol/b81633bdbfa09bb55e2b

0 投票
2 回答
274 浏览

javascript - Java 8 Nashorn 空格问题

更新:

我有一个可行的总体解决方案,但我不喜欢它:

jjs> NANO_HOME = '"/Users/XXXXXX/Desktop/TEST DIR"'; jjs> $EXEC('xargs ls',"${NANO_HOME}");


我正在使用 Java 8 Nashorn 执行一些 shell 脚本,如果目录名称包含空格,我在目录中列出文件时遇到问题:

我已经尝试了几十种变化,但没有任何效果......

0 投票
2 回答
1228 浏览

java - 为什么 Java Nashorn __DIR__、__LINE__ 和 __FILE__ 为空?

我正在尝试在由 Java Nashorn Engine (JDK 8) 编译和评估的 JavaScript 文件中获取__DIR__,__LINE____FILE__ Nashorn 全局变量。

但是,它们都返回NULL ...

它们是否与某些特定的 Nashorn 配置有关?它没有在文档中说明任何其他配置以使它们正常工作。