我知道API非常不同,但是内置的JavaScript东西与Mozilla可以获得的Rhino构建之间是否有任何功能差异?
我正在寻找与Python2.x相当的javascript print "hi"
.我正在使用ubuntu终端中的Rhino javascript解释器.当我输入:
document.write{"hi"}
Run Code Online (Sandbox Code Playgroud)
我得到'文档'未定义的错误.
我正在使用Rhino 1.7R4和env.js 1.2在Java中运行Javascript代码
我想从我的Javascript代码中打印一个字符串到Java控制台.
根据:http: //evilroundabout.blogspot.com.au/2009/11/javascript-printing-rhino.html
我应该使用:print("Hello world");
但当我这样做时,我得到:
org.mozilla.javascript.EcmaError: ReferenceError: "print" is not defined. (svg-renderer-highcharts-2.1.4.js#20)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3750)
at org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1794)
at org.mozilla.javascript.ScriptRuntime.getNameFunctionAndThis(ScriptRuntime.java:2188)
at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1308)
at script.renderSVGFromObject(svg-renderer-highcharts-2.1.4.js:20)
Run Code Online (Sandbox Code Playgroud)
如果我使用document.write,我看不到任何输出.
我一直在我的项目上使用YuiCompressorTask(最新版本)很长一段时间没有任何问题.在OSX上升级到Oracle的Java 1.7软件包之后,它会出现以下异常(这是针对javascript文件;它适用于css文件):
[yuiCompress] java.lang.reflect.InvocationTargetException
[yuiCompress] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[yuiCompress] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[yuiCompress] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[yuiCompress] at java.lang.reflect.Method.invoke(Method.java:601)
[yuiCompress] at com.yahoo.platform.yui.compressor.Bootstrap.main(Bootstrap.java:21)
[yuiCompress] at ww.ant.YuiCompressorTask.execute(YuiCompressorTask.java:40)
[yuiCompress] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[yuiCompress] at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
[yuiCompress] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[yuiCompress] at java.lang.reflect.Method.invoke(Method.java:601)
[yuiCompress] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[yuiCompress] at org.apache.tools.ant.Task.perform(Task.java:348)
[yuiCompress] at org.apache.tools.ant.Target.execute(Target.java:390)
[yuiCompress] at org.apache.tools.ant.Target.performTasks(Target.java:411)
[yuiCompress] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
[yuiCompress] at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
[yuiCompress] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[yuiCompress] at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
[yuiCompress] at org.apache.tools.ant.Main.runBuild(Main.java:809)
[yuiCompress] at org.apache.tools.ant.Main.startAnt(Main.java:217)
[yuiCompress] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[yuiCompress] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
[yuiCompress] Caused by: java.util.MissingResourceException: Can't find bundle for …
Run Code Online (Sandbox Code Playgroud) 是否有任何关于使用java方法调用rhino-javascript函数并将其返回给java的示例?我发现rhino的唯一例子是只在rhino shell上输入命令.
我在javax.scripting地图实现中看到了一些奇怪的行为.
在线示例显示了在js环境中添加到列表的示例:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
List<String> namesList = new ArrayList<String>();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");
jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try
{
jsEngine.eval("var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}"
+ "namesListKey.add(\"Dana\");");
} catch (ScriptException ex)
{
ex.printStackTrace();
}
System.out.println(namesList);
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试使用地图执行类似操作,则会看到奇怪的行为.首先,如果您尝试迭代地图键,例如
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
Run Code Online (Sandbox Code Playgroud)
无法获取地图密钥 - 如果您尝试迭代密钥,则会获得方法名称 -
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
Run Code Online (Sandbox Code Playgroud)
结果是 :
notifyAll
removeAll
containsAll …
Run Code Online (Sandbox Code Playgroud) 我想编译*.less
特定文件夹中的所有脚本,并使用less-rhino-1.1.3.js进行子目录.
在github上有一个例子,用于为特定文件执行此操作,这非常有效.但是我想为一个完整的文件夹做同样的事情.我尝试了很多,这是我的最后一次尝试.
它不起作用,propertyregex
似乎不是标准的ANT,我不想用这样的东西.我甚至不确定这段代码是否有用.
<project name="test" default="main" basedir="../../">
<property name="css.dir" location="public/css"/>
<property name="tool.less" location="bin/less/less-rhino-1.1.3.js"/>
<property name="tool.rhino" location="bin/tools/rhino/js.jar"/>
<macrodef name="lessjs">
<attribute name="input" />
<attribute name="output" />
<sequential>
<java jar="${tool.rhino}" fork="true" output="@{output}">
<arg path="${tool.less}"/>
<arg path="@{input}"/>
</java>
<echo>Lessjs: generated @{output}</echo>
</sequential>
</macrodef>
<target name="main">
<echo>compiling less css</echo>
<fileset dir="${css.dir}" id="myfile">
<filename name="**/*.less" />
</fileset>
<property name="lessfilename" refid="myfile"/>
<propertyregex property="cssfilename"
input="${lessfile}"
regexp="^(.*)\.less$"
replace="^\1\.css$"
casesensitive="true" />
<lessjs input="lessfile" output="cssfilename"/>
</target>
</project>
Run Code Online (Sandbox Code Playgroud) 参加以下测试:
public static class Scripted {
public void setThing(List<?> list) {
System.out.println("Set via list");
}
public void setThing(Object[] array) {
System.out.println("Set array");
}
}
@Test
public void testScripting() throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.getContext().setAttribute("s", new Scripted(), ScriptContext.ENGINE_SCOPE);
engine.eval("s.thing = Array(1, 2, 3);");
}
Run Code Online (Sandbox Code Playgroud)
随着使用Java 7的Rhino版本运行,如果你运行它,你将得到如下的异常:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: The choice of Java constructor setThing matching JavaScript argument types (object) is ambiguous; candidate constructors are:
void setThing(java.util.List)
void setThing(java.lang.Object[]) (<Unknown source>#1) in <Unknown source> at line number 1
Run Code Online (Sandbox Code Playgroud)
该 …
我在Java7中遇到Rhino javascript引擎的性能问题,很快 - 我的脚本(解析和编译文本)在Chrome中运行的速度比Java7 Rhino脚本引擎快50到100倍.
我试图找到改善情况的方法,并发现Rhino支持编译脚本.我尝试用我的脚本做这件事,实际上没有看到任何改进.最后 - 我最终得到了一个虚拟的短测试套件,我认为编译版和解释版之间的性能没有任何差别.请让我知道我做错了什么.
注意:有些消息来源提到Rhino引擎运行编译脚本比直接用Java编写的"相同"代码慢大约1.6.不确定此示例中使用的"脚本编译"是否与假设相同.
测试java类如下,我在我的机器上得到的样本结果......
结果
Running via com.sun.script.javascript.RhinoScriptEngine@c50443 ... time: 886ms, chars: 38890, sum: 2046720 time: 760ms, chars: 38890, sum: 2046720 time: 725ms, chars: 38890, sum: 2046720 time: 765ms, chars: 38890, sum: 2046720 time: 742ms, chars: 38890, sum: 2046720 ... 3918ms Running via com.sun.script.javascript.RhinoCompiledScript@b5c292 @ com.sun.script.javascript.RhinoScriptEngine@f92ab0 ... time: 813ms, chars: 38890, sum: 2046720 time: 805ms, chars: 38890, sum: 2046720 time: 812ms, chars: 38890, sum: 2046720 time: 834ms, chars: 38890, sum: 2046720 time: 807ms, chars: …
我使用Rhino作为图形内部的脚本组件.在该项目中,大约有200个小脚本独立运行.启动应用程序时,脚本应立即全速运行.Rhino的表现已经足够了,但是自从Oracle建议迁移到Nashorn之后,我面临着一个困境.
下图显示了Rhino和Nashorn之间的负载差异,大约有15,000个脚本调用.Nashorn的创业缓慢是我最大的问题.
注意,这是在JDK 1.8.0上.JDK 1.8u5是类似的
我希望图片清晰.
这是我如何使用ScriptEngine的概述:
下面我提供了一个运行时配置文件,说明了引擎随时间的繁忙程度;
有谁知道如何克服Nashorn的创业缓慢?
更新
2015 年4月15日在Java8u45上使用200个单独的脚本进行相同的测试.
性能要好得多!在Java7上以与Rhino类似的速度运行.
rhino ×10
java ×7
javascript ×5
ant ×1
debugging ×1
java-7 ×1
java-8 ×1
less ×1
linux ×1
nashorn ×1
overloading ×1
performance ×1
scripting ×1
yui ×1