Tag: nashorn

Nashorn访问非静态Java方法

在Java 7(1.7)中,我可以通过运行以下命令从JavaScript访问Java方法: ScriptEngine jse = new ScriptEngineManager().getEngineByName(“JavaScript”); jse.eval(“importClass(net.apocalypselabs.symat.Functions);”); jse.eval(“SyMAT_Functions = new net.apocalypselabs.symat.Functions();”); String input = “notify(\”Foo\”);”; // This is user input jse.eval(“with(SyMAT_Functions){ “+input+” }”); 哪个将从Functions java类运行notify()函数: public class Functions { private Object someObjectThatCannotBeStatic; public void notify(Object message) { JOptionPane.showMessageDialog(null, message.toString()); } /* Lots more functions in here, several working with the same non-static variable */ […]

getEngineByName(“nashorn”)返回null

无法获得Nashorn引擎 ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”); engine.eval(“print(‘Hello World!’);”); engine返回null 我正在使用eclipse,jdk1.8.0_11 java -version java版“1.8.0_20-ea” Java(TM)SE运行时环境(版本1.8.0_20-ea-b23)

Avatar.js和Project Avatar

在Java 8和Nashorn的上下文中,我看到有两个项目经常被提及。 Avatar.js和Project Avatar 这些项目的关系是什么? Avatar.js的文档很少。 据我所知,它提供了在JVM上执行节点应用程序的可能性。 项目头像似乎建立在Avatar.js上。 但是,范围似乎是为Java EE 7提供替代Web框架。是否也可以使用Project Avatar执行节点程序(例如grunt)?

在java和javascript之间传递JSON的有效方法

我对Nashorn很新,并且在JVM之上编写脚本,并想知道我是否可以让我的java代码和javascripts更有效地进行通信。 我正在使用与JS对象一起使用的第三方JS库,在我的java代码中,我将要传递的数据作为Map data传递。 因为第三方JS希望使用普通的JS对象,所以我无法按原样传递data ,尽管脚本引擎允许您访问Map,就像它是一个普通的JS对象一样。 我正在使用的脚本在data参数上使用’hasOwnProperty’,并且在Java对象上调用时失败。 当我尝试使用Object.prototype.hasOwnProperty.call(data,’myProp’)时,它也不起作用并且总是返回’false’。 基本问题是Java Object不是javascript对象原型。 我最终做了这样的事情: Map data; ObjectMapper mapper = new ObjectMapper(); String rawJSON = mapper.writeValueAsString(data); ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”); engine.eval(‘third_party_lib.js’); engine.eval(‘function doSomething(jsonStr) { var jsObj = JSON.parse(jsonStr); return doSomethingElse(jsObj); }’); Object value = ((Invocable) engine).invokeFunction(“doSomething”, rawJSON); 这可以按预期工作,但所有这些来回JSON解析很重,感觉可能有更简单,更快速和更直接的方式来做到这一点。 那么,有没有更好的方法在Java和Javascript之间传递JSON或者在我的Java代码中创建兼容的JS对象? 我已经看过使用mustache.js进行模板渲染的这个指南,但它做的几乎是一样的。 谢谢 !

中断运行nashorn脚本的java线程

在下面的代码中,我有一个javascript运行在与主要的一个单独的线程中。 该脚本是一个无限循环,所以它需要以某种方式终止。 怎么样? 脚本开始运行后,调用.cancel()不起作用。 但是如果我在线程初始化之后调用.cancel(),它将终止它(注释掉的行)。 package testscriptterminate; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.Timer; import java.util.TimerTask; public class TestScriptTerminate extends TimerTask{ private ExecutorService threads; private Future runScript; private Timer t; public TestScriptTerminate(){ t = new Timer(); t.schedule(this, 6000); //let the script run for a while before attempt to […]

Java 8 Javascript引擎向后兼容性

我正在我的项目中尝试Java 8,并且我遇到了与构建过程相关的错误。 我正在使用ANT脚本,在某些时候我使用一些javascript(嵌入到ANT中)来做一些构建特定的操作。 导致错误的脚本部分如下所示: 该项目正在使用Java 7或Java 6构建,但是当我使用Java 8时它会给我一些错误。这些错误与JS引擎的升级有关。 特别是我得到以下exception: javax.script.ScriptException:ReferenceError:“importClass”未在行中定义 经过一些谷歌搜索后,我发现它与JDK中的以下问题有关 [#JDK-8025132] 我尝试了评论中的建议,但没有运气。 如何使Java 8 Nashorn引擎与Rhino JS引擎兼容?

readFully没有使用Java Nashorn Javascript Engine定义

我正在尝试使用新的Java 8 Nashorn javascript引擎运行javascript脚本,但它失败并出现以下错误: :1 ReferenceError: “readFully” is not defined 该脚本使用应该在全局范围内定义的readFully函数nashorn在启用脚本模式的情况下运行(这是通过ScriptEngine运行时的默认值,如http://mail.openjdk.java.net/pipermail/nashorn- dev / 2013-December / 002562.html )。 以下是重现错误的示例: import java.io.FileNotFoundException; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Test { public static void main(String[] argv) throws FileNotFoundException, ScriptException { ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName(“nashorn”); scriptEngine.eval(“print(‘Hey!’);print(print);print(readFully);”); } } 这个样本打印嘿! 然后是print函数的源代码(另一个nashorn内置函数),最后它应该打印readFully方法的源代码。 但我有这个例外: Exception in thread “main” javax.script.ScriptException: […]

我如何开始使用Oracle的Nashorn JS引擎进行编码?什么时候它会取代OpenJDK中的Rhino?

我正在寻找一种方法来开始使用Oracle的新Nashorn JavaScript引擎。 我已经DL了最新的OpenJDK 8(b65),看起来Rhino仍然是唯一包含的脚本引擎。 任何人都知道Nashorn何时(或在哪个版本中)将取代OpenJDK中的Rhino? 或者甚至更好,我可以在哪里获得包含它的JDK? 我知道Netbeans已经编写了一个调试器来使用它,只是不确定他们从哪里获得了库/代码来开始编写它。 有人有链接吗? 谢谢。

使用Nashorn编写Java脚本(JSR 223)和预编译

我通过JSR 223使用Nashorn来执行用户输入脚本的小片段: public Invocable buildInvocable(String script) throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByName(ENGINE); engine.eval(functions); engine.eval(script); return (Invocable) engine; } 变化的用户脚本调用在静态中央库中定义的JavaScript函数(保存在上面代码片段中的functions String中)。 每当我想要获取一个可以从我的Java调用的Invocable ,我就不得不重新编译大型库代码。 有没有办法用新代码加入以前编译的代码片段?

Nashorn创业缓慢可以克服吗?

我使用Rhino作为图形内部的脚本组件。 在该项目中,大约有200个小脚本独立运行。 启动应用程序时,脚本应立即全速运行。 Rhino的表现已经足够了,但自从Oracle建议迁移到Nashorn之后,我面临着一个困境。 下图显示了Rhino和Nashorn之间的负载差异,大约有15,000个脚本调用。 Nashorn的创业缓慢是我最大的问题。 注意,这是在JDK 1.8.0上。 JDK 1.8u5是类似的 我希望图片清晰。 这是我如何使用ScriptEngine的概述: 我正在使用One scripting Engine实例, 我为每个脚本创建一个CompiledScript对象, Swingworker执行一次CompiledScript.eval()。 每半秒SwingWorkers就会启动。 每个CompiledScript都有自己的SimpleScriptContext实例,可以在每次执行时重复使用。 下面我包含了一个运行时配置文件,说明了引擎随时间的繁忙程度; 有谁知道如何克服Nashorn的创业缓慢? 更新于2015年4月15日 在Java8u45上使用200个单独的脚本进行相同的测试。 性能要好得多! 在Java7上运行与Rhino类似。