我试图在ant标签中使用最新版本的Rhino,但它似乎使用的是与JVM捆绑在一起的Rhino版本.我已经尝试调整类路径来指定Rhino脚本jar.目前,我尝试过以下方法:
<project default="hello" name="hello-world" basedir=".">
<target name="hello">
<script language="javascript">
<classpath>
<pathelement location="js.jar"/>
</classpath><![CDATA[
x=<hello><world/></hello>
]]></script>
</target>
</project>
Run Code Online (Sandbox Code Playgroud)
请注意在脚本中包含E4X语法,该语法仅适用于Mozilla的Rhino,而不适用于与JVM捆绑的Rhino.
js.jar与ant脚本位于同一目录中.我也尝试将其重命名为rhino.jar,因为我认为我已经看到文档表明这是必要的.
当我运行它时,它会给出以下错误:
javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:语法错误(#3)
因此,它似乎仍然使用JVM附带的Rhino版本.如何让它使用新版本?
我正在尝试使用一些JavaScript来读取JSON文件,我正在通过Java JSR-223 API与Rhino一起评估.我正在尝试使用Rhino shell,但不能使用我的Java代码中的嵌入式Javascript.
这是有效的:
$ java -jar js.jar
js> readFile('foo.json');
{y:"abc"}
Run Code Online (Sandbox Code Playgroud)
这是不起作用的:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("js");
engine.eval("readFile('foo.json')");
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Exception in thread "main" javax.script.ScriptException:
sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "readFile" is not defined. (<Unknown source>#4) in <Unknown source> at line number 4
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232)
Run Code Online (Sandbox Code Playgroud)
我怎样才能readFile在我的引擎中使用它?
如何在由Java运行的Rhino Engine评估的另一个脚本"Foo"中包含一个脚本"Bar".
IE,在Java中设置这样的脚本引擎:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
BufferedReader br = new BufferedReader(new FileReader(new File("Foo.js")));
engine.eval(br);
Run Code Online (Sandbox Code Playgroud)
......并将以下内容放入Foo:
load(["Bar.js"])
Run Code Online (Sandbox Code Playgroud)
根据Rhino shell文档,这是实现它的方法.但是从Java运行时,它显然没有实现:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.
Run Code Online (Sandbox Code Playgroud)
@Phillip:
感谢您的创意回应.您的解决方案不太有效,因为除非使用Invocable接口,否则eval不会使解析的函数可用.此外,它在Java代码不可访问的情况下不起作用.我详细阐述了你的解决方法并创建了一些适用于纯JS的东西:
首先创建一个引擎,公开Invocable接口:
var engine = new Packages.javax.script.ScriptEngineManager().getEngineByName("javascript");
engine = Packages.javax.script.Invocable(engine);
Run Code Online (Sandbox Code Playgroud)
然后"加载()"脚本
engine.eval(new java.io.FileReader('./function.js'));
Run Code Online (Sandbox Code Playgroud)
此时,可以使用以下方法评估函数:
engine.invokeFunction("printHello", null);
Run Code Online (Sandbox Code Playgroud) 尽可能清理代码以显示我的问题。基本上它是一个八叉树搜索+相交。intersect 函数来自一个 SDK(整个项目是一个犀牛插件)。如果我使用交叉调用进行循环,它比通过八叉树进行递归搜索快 10 倍。甚至更奇怪 - 我隔离了相交调用的时间 - 在递归内部它比循环慢 8 倍。它的行为可能有 1000 个原因,但我希望我犯了一些明显的错误,有人可以通过查看代码发现。
有一个缓慢的递归部分:
public void NewRayCast()
{
int runs = 500000; //how many rays we cast
Point3d raypos = new Point3d(0, 0, 0); //raystart
Ray3d ray = new Ray3d();
Random r = new Random(); //here we create targets to scatter the ray directions
Vector3d[] targets = new Vector3d[runs];
for (int i = 0; i < runs; i++)
{
targets[i] = new Vector3d(r.NextDouble() * 200 - 100, 500, r.NextDouble() * …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 android 项目中使用rhino。我黎明加载了 Rhino 并添加js.jar了lib.
\n这是我的MainActivity:
public class MainActivity extends AppCompatActivity {\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n ...\n\n Context rhino = Context.enter();\n// try{ // I commented it to catch the error\n rhino.setLanguageVersion(Context.VERSION_1_2);\n Scriptable scope = rhino.initStandardObjects();\n Object result=rhino.evaluateString(scope, \n "obj={a:1,b:[\'x\',\'y\']}", "MySource", 1, \n null); // This line cannot be compiled\n\n Scriptable obj = (Scriptable)scope.get("obj",scope);\n Log.i("JS","obj " + (obj == result ? "==" : "!=") +" result");\n\n Log.i("js","obj.a == " + …Run Code Online (Sandbox Code Playgroud) JavaScript 是否在网络浏览器之上运行?
喜欢运行在 JVM 之上的 Java 吗?
或者它实际上编译成二进制代码并在机器上运行吗?
昨天弄清楚如何配置我的Eclipse项目以便能够运行JS代码(如果你感兴趣:在Java内部为Google AppEngine构建一个JS服务器),我有下一个与此主题相关的问题:我有一个JS文件和其中的一个功能.我需要在我的Java代码中运行该函数并在其中传递(Java字符串)变量.我的文件非常基本,目前看起来像这样:
public class Com_feedic_readabilityServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
Context cx = ContextFactory.getGlobal().enterContext();
cx.setOptimizationLevel(-1);
cx.setLanguageVersion(Context.VERSION_1_5);
Global global = Main.getGlobal();
global.init(cx);
Main.processSource(cx, "server_js/js_init.js");
}
}
Run Code Online (Sandbox Code Playgroud)
我现在需要做的是调用该函数run()的内js_init.js-file.我该如何管理?
以下数据:
sku=[111222]
Run Code Online (Sandbox Code Playgroud)
正在作为参数传递给在Rhino javascript引擎中调用的javascript函数.
在java端(数据源自此处)这意味着"sku"的String键被映射到其中包含一个字符串"111222"的ArrayList.
一旦这转到了Rhino方面,我不知道如何将其用作javascript对象.例如:我如何做一些简单的事情就像在JS端获取111222值一样简单?
我决定吐出这个对象的键/值转储在JS方面的样子,这就是我得到的:
sku=
empty: false
indexOf: function indexOf() {/*
int indexOf(java.lang.Object)
*/}
notifyAll: function notifyAll() {/*
void notifyAll()
*/}
removeAll: function removeAll() {/*
boolean removeAll(java.util.Collection)
*/}
trimToSize: function trimToSize() {/*
void trimToSize()
*/}
containsAll: function containsAll() {/*
boolean containsAll(java.util.Collection)
*/}
contains: function contains() {/*
boolean contains(java.lang.Object)
*/}
equals: function equals() {/*
boolean equals(java.lang.Object)
*/}
notify: function notify() {/*
void notify()
*/}
subList: function subList() {/*
java.util.List subList(int,int)
*/}
class: class java.util.ArrayList
set: function set() {/* …Run Code Online (Sandbox Code Playgroud) 我尝试使用整数数组列表并检查var中是否存在.它适用于字符串数组但不适用于整数数组.
public static void main(String[] args) throws ScriptException {
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add(2);
List<String> lists = new ArrayList<String>();
lists.add("1");
lists.add("2");
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.put("list", list);
System.out.println(engine.eval("list.indexOf(1)"));
//print -1 , Why ?
engine.put("lists", lists);
System.out.println(engine.eval("lists.indexOf('1')"));
//print 0
}
Run Code Online (Sandbox Code Playgroud)
代码有什么问题?
我试图从一个轻松的JavaScript使用功能访问OSGi服务.通过吊索SlingScriptHelper.我可以sling.getService(Service.class)从javascript 调用该方法,但我不知道如何在javascript中指定类.
看起来应该可以使用完全限定名称或使用rhino来引用java类importPackage(..).
但是,我得到以下异常:
org.apache.sling.scripting.sightly.SightlyException:
org.mozilla.javascript.EvaluatorException: Can't find method
org.apache.sling.scripting.core.impl.InternalScriptHelper.getService(object).
Run Code Online (Sandbox Code Playgroud)